澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

Linux文本管理命令

Shell历史

  • Shell的意义是分解用户的通令,用户输入一条命令,Shell就分解施行一条,那条措施叫做交互式(interactive),Shell还会有一种实行命令的必定要经过的道路叫做批管理(batch),用户优先写三个Shell脚本(script),在那之中有好些个条命令,让Shell二次把这么些命令实施完,而不必一条条地敲命令。Shell脚本和编程语言相似,也许有变量和流程序调控制语句,但Shell脚本是解说奉行的,无需编写翻译,Shell程序从剧本中一行一行读取并施行这个命令,相当于叁个用户把脚本中的命令一行一行敲到Shell指示符下执行。
  • 出于历史原因,UNIX系统上有很三种Shell:

    • 1、sh(Bourne Shell):由SteveBourne开拓,各样UNIX系统都配有sh。
    • 2、csh(C Shell):由Bill Joy开辟,随BSD UNIX揭橥,它的流程序调控制语句很象C语言,帮助广大Bourne Shell把不帮忙的效劳:作业调整,命令历史,命令行编辑。
    • 3、ksh(Korn Shell):由大卫Korn开垦,向后十二分sh的法力,并且增加了csh引进的新职能,是日前数不胜数UNIX系统规范配置的Shell,在那些系统上/bin/sh往往是指向/bin/ksh的记号链接。
    • 4、tcsh(TENEX C Shell):是csh的巩固版本,引进了指令补全等功用,在FreeBSD、MacOS X等系统上代表了csh。
    • 5、bash(Bourne Again Shell):由GNU开辟的Shell,首要对象是与POSIX标准保持一致,同有的时候候兼任对sh的合营,bash从csh和ksh借鉴了数不完功用,是各类Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash和符号链接。尽管这么,bash和sh照旧有过多例外的,一方面,bash扩张了一部分发令和参数,另一方面,bash并不完全和sh包容,有个别行为并差异等,所以bash需求效法sh的作为:当我们透过sh这么些程序名运行bash时,bash能够假装本身是sh,不认增添的授命,并且作为与sh保持一致。

        $ cat /etc/passwd
        root:x:0:0:root:/root:/bin/zsh
        daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
        bin:x:2:2:bin:/bin:/usr/sbin/nologin
        sys:x:3:3:sys:/dev:/usr/sbin/nologin
        sync:x:4:65534:sync:/bin:/bin/sync
      
  • 用户在命令行输入指令后,一般境况下Shell会fork并exec该命令,可是Shell的内建命令例外,推行内建命令相当于调用Shell进度中的多少个函数,并不创建新的长河。以前学过的cd、alias、umask、exit等一声令下便是内建命令,凡是用which命令查不到程序文件所在地点的授命都以内建命令,内建命令没有独立的man手册,要在man手册中查看内建命令,应该实施

      $ man bash-builtins
    
  • 如export、shift、if、eval、[、for、while等等。内建命令就算不创建新的进程,但也有Exit Status,日常也用0表示成功非零表示失利,固然内建命令不创设新的经过,但实施完成后也可能有贰个状态码,也足以用特殊变量$?读出。

Shell编程,linuxshell编程

Author: Shixiang Wang

Linux文本管理命令

进行脚本

  • 编排多个不难易行的脚本test.sh:

      #! /bin/sh
      cd ..
      ls
    
  • Shell脚本中用#表示注释,约等于C语言的//注释。但一旦#坐落第一行开始,并且是#!(称为Shebang)则不一样,它代表该脚本使用前面钦定的解释器/bin/sh解释试行。如若把那一个本子文件加上可执行权限然后施行:

      $ chmod a x test.sh
      $ ./test.sh
    
  • Shell会fork三个子经过并调用exec实施./test.sh这些顺序,exec系统调用应该把子进度的代码段替换来./test.sh程序的代码段,并从它的_start发端施行。但是test.sh是个文本文件,根本没有代码段和_start函数,咋做呢?其实exec还大概有别的一种机制,倘若要实施的是三个文书文件,并且第一行用Shebang内定精通释器,则用解释程序的代码段替换当前进度,并且从解释器的_start起来进行,而以此文件文件被当作命令行参数字传送给解释器。因而,实行上述脚本也就是实践顺序

      $ /bin/sh ./test.sh
    
  • 以这种措施执行无需test.sh文件可实行权限。

  • 假设将下令行下输入的指令用()括号括起来,那么也会fork出三个子Shell施行小括号中的命令,一行中能够输入由支行;隔断的七个命令,比如:

      $ (cd ..; ls -l)
    
  • 和地点两种方法试行Shell脚本的听从是同样的,cd ..命令改换的是子Shell的PWD,而不影响到交互式Shell。

      $ cd ..; ls -l
    
  • 则差别的法力,cd ..一声令下是直接在交互式Shell下进行的,更动交互式Shell的PWD,但是这种艺术相当于如此实行Shell脚本:

      $ source ./test.sh
      或者
      $ . ./test.sh
    
  • source大概.命令是Shell的内建命令,这种措施也不会创建子Shell,而是直接在交互式Shell下逐行实践脚本中的命令。

Shell历史

  • Shell的机能是表明用户的授命,用户输入一条命令,Shell就分解实践一条,那条措施叫做交互式(interactive),Shell还恐怕有一种执行命令的秘籍叫做批管理(batch),用户优先写二个Shell脚本(script),其中有数不胜数条命令,让Shell三遍把那些命令施行完,而不必一条条地敲命令。Shell脚本和编制程序语言相似,也可以有变量和流程序调控制语句,但Shell脚本是表达施行的,无需编写翻译,Shell程序从剧本中一行一行读取并实行那些命令,相当于贰个用户把脚本中的命令一行一行敲到Shell提示符下试行。
  • 是因为历史由来,UNIX系统上有很四种Shell:

    • 1、sh(Bourne Shell):由SteveBourne开垦,种种UNIX系统都配有sh。
    • 2、csh(C Shell):由Bill 乔伊开荒,随BSD UNIX公布,它的流程序调节制语句很象C语言,支持广大Bourne Shell把不帮衬的遵从:作业调控,命令历史,命令行编辑。
    • 3、ksh(Korn Shell):由戴维Korn开采,向后特别sh的法力,并且加多了csh引进的新成效,是近日无尽UNIX系统规范配置的Shell,在这个系统上/bin/sh往往是指向/bin/ksh的标记链接。
    • 4、tcsh(TENEX C Shell):是csh的拉长版本,引进了指令补全等成效,在FreeBSD、MacOS X等系统上代表了csh。
    • 5、bash(Bourne Again Shell):由GNU开荒的Shell,主要对象是与POSIX标准保持一致,同不时候兼任对sh的十二分,bash从csh和ksh借鉴了过多功效,是各类Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash和标志链接。就算这么,bash和sh仍旧有好多见仁见智的,一方面,bash扩充了有的发令和参数,另一方面,bash并不完全和sh包容,有个别行为并不等同,所以bash须要效法sh的一举一动:当我们经过sh这几个顺序名运营bash时,bash能够假装本人是sh,不认扩大的通令,并且作为与sh保持一致。

      $ cat /etc/passwd
      root:x:0:0:root:/root:/bin/zsh
      daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
      bin:x:2:2:bin:/bin:/usr/sbin/nologin
      sys:x:3:3:sys:/dev:/usr/sbin/nologin
      sync:x:4:65534:sync:/bin:/bin/sync
      
  • 用户在命令行输入指令后,一般景况下Shell会fork并exec该命令,不过Shell的内建命令例外,施行内建命令约等于调用Shell进度中的一个函数,并不创制新的长河。以前学过的cd、alias、umask、exit等一声令下正是内建命令,凡是用which命令查不到程序文件所在位置的通令都以内建命令,内建命令未有独立的man手册,要在man手册中查看内建命令,应该实施

    $ man bash-builtins
    
  • 如export、shift、if、eval、[、for、while等等。内建命令纵然不创立新的进程,但也有Exit Status,常常也用0表示成功非零表示退步,即便内建命令不创制新的经过,但实践完结后也许有二个状态码,也得以用独特变量$?读出。

[TOC]

正则说明式

POSIX标团长正则表明式分为两类
1.主导的正则表明式
2.扩展的正则说明式
大部Linux应用和工具仅协理中央的正则表明式

主旨语法

推行脚本

  • 编排二个简单的脚本test.sh:

    #! /bin/sh
    cd ..
    ls
    
  • Shell脚本中用#意味着注释,也就是C语言的//注释。但万一#放在第一行开始,并且是#澳门新浦京娱乐场网站,!(称为Shebang)则区别,它表示该脚本使用后边钦定的解说器/bin/sh解释施行。假若把这么些本子文件加上可进行权限然后执行:

    $ chmod a x test.sh
    $ ./test.sh
    
  • Shell会fork一个子进程并调用exec执行./test.sh本条顺序,exec系统调用应该把子进度的代码段替换到./test.sh程序的代码段,并从它的_start起头实践。但是test.sh是个文件文件,根本未曾代码段和_start函数,咋办吧?其实exec还也是有别的一种机制,如果要举办的是三个文件文件,并且第一行用Shebang钦命驾驭释器,则用解释程序的代码段替换当前过程,并且从解释器的_start起来执行,而以此文件文件被当作命令行参数字传送给解释器。由此,推行上述脚本约等于实施顺序

    $ /bin/sh ./test.sh
    
  • 以这种措施施行不须求test.sh文件可实行权限。

  • 假如将下令行下输入的授命用()括号括起来,那么也会fork出二个子Shell实行小括号中的命令,一行中能够输入由支行;隔离的四个命令,举个例子:

    $ (cd ..; ls -l)
    
  • 和上边二种艺术实践Shell脚本的成效是同一的,cd ..一声令下改动的是子Shell的PWD,而不影响到交互式Shell。

    $ cd ..; ls -l
    
  • 则差异的遵从,cd ..指令是直接在交互式Shell下施行的,改动交互式Shell的PWD,但是这种艺术相当于那样举办Shell脚本:

    $ source ./test.sh
    或者
    $ . ./test.sh
    
  • source也许.命令是Shell的内建命令,这种措施也不会成立子Shell,而是一向在交互式Shell下逐行实行脚本中的命令。

grep

核心正则表明式

符号 意义
* 0个或多个字符
. 匹配任意字符
^ 行首,在[]中表示非
$ 行尾
[] 匹配字符集合
转义字符
<> 精确匹配符号
{n} 匹配n次
{n,} 匹配至少n次
{m,n} 匹配m~n次

变量

  • 遵从规矩,Shell变量常常由字母加下划线开端,由任性长度的字母、数字、下划线组成。有三种档案的次序的Shell变量:
    • 1、情况变量
      • 情形变量能够从父进程传给子进度,因些Shell进度的意况变量能够从最近Shell过程传给fork出来的子进度。用printenv命令能够显稳妥前Shell的景况变量。
    • 2、本地变量
      • 只设有于当下Shell进程,用set指令能够彰显当前Shell进度中定义的富有变量(包括地面变量和情形变量)和函数。
  • 情况变量是其余进度都有的概念,而本地变量是Shell特有的定义。在Shell中,情状变量和地点变量的概念和用法相似。在Shell中定义或赋值三个变量:

      $ VARNAME=value
    
  • 小心等号两边都不可能有空格,不然会被Shell解释成命令行参数。

  • 三个变量定义后仅设有于这几天Shell进度,它是当地变量,用export命令能够把本地变量导出为情状变量,定义和导出境况变量平常能够一步成功:

      $ export VARNAME=value
    
  • 也能够分两步成功:

      $ VARNAME=value
      $ export VARNAME
    
  • 用unset命令能够删除已定义的情形变量或本地变量。

      $ unset VARNAME
    
  • 假定三个变量叫做VA中华VNAME,用'VA君越NAME'能够代表它的值,在不引起歧义的处境下也可以用VA福特ExplorerNAME表示它的值。通过以下的例子比较那三种表示法的不如:

      $ echo $SHELL
    
  • 留神,在概念变量时不要"'",取变量值时要用。和C语言差别的是,Shell变量不需求分明定义类型,事实上Shell变量的值都以字符串,比方大家定义VA奇骏=45,其实VA本田UR-V的值是字符串45而非整数。Shell变量无需先定义后选拔,借使一个从未定义的变量取值,则值为空字符串。

主干语法

grep的为主用法

grep命令是永葆正则表明式的叁个多用途文本寻觅工具,一般格式为

grep 选项 模式 文件

选项 意义
-c 只输出匹配行的数量
-i 搜索时忽略大小写
-h 查询多文件时不显示文件名
-l 只列出符合匹配的文件名,而不列出具体的匹配行
-n 列出所有的匹配行,并显示行号
-s 不显示不存在或无匹配文本的错误信息
-v 显示不包含匹配文本的所有行
-w 匹配整词
-x 匹配正行
-r 递归搜索,不仅搜索当前目录,而且搜索子目录
-q 禁止输出任何结果,以退出状态表示搜索是否成功
-b 打印匹配行距文件头部的偏移量,以字节为单位
-o 与-b选项结合使用,打印匹配的词距文件头部的偏移量,以字节为单位
-E 支持扩展的正则表达式
-F 不支持正则表达式,按照字符串的字面意思进行匹配

grep命令的方式特别灵活,可以是字符串,也得以是变量,还足以是正则表明式。注意,无论方式是何种格局,只要方式中包括空格,就必要利用双引号将形式引起来。

增添正则表达式

符号 意义
? 匹配0个或1个
匹配1个或多个
() 表示一个字符集合或用在expr中
| 表示或

文本名代换(Globbing)

  • 这一个用于匹配的字符称为通配符(Wildcard),如:*?[],具体如下:

    • *相称0个或多少个随机字符
    • ?合作多个随意字符
    • [多少字符]同盟方括号中随便二个字符的一回面世

        $ ls /dev/ttyS*
        $ ls ch0?.doc
        $ ls ch0[0-2].doc
        $ ls ch[012][0-9].doc
      
    • 留神,Globbing所相配的文书名是由Shell张开的,也正是说在参数还没传给程序从前曾经拓展了,举个例子上述ls ch0[012].doc指令,假诺当前目录下有ch00.doc和ch02.doc,则传给ls命令的参数实际上是这三个文件名,而不是二个匹配字符串。

变量

  • 服从常规,Shell变量常常由字母加下划线开首,由狂妄长度的字母、数字、下划线组成。有三种档期的顺序的Shell变量:

    • 1、碰着变量
      • 遭受变量能够从父进度传给子进程,因些Shell进程的景况变量能够从当前Shell进度传给fork出来的子进度。用printenv一声令下可以来伏贴前Shell的情状变量。
    • 2、本地变量
      • 只设有于这段时间Shell进度,用set命令能够展现当前Shell进度中定义的保有变量(包含地点变量和情形变量)和函数。
  • 蒙受变量是其余进度都有个别概念,而本土变量是Shell特有的定义。在Shell中,情状变量和本地变量的概念和用法相似。在Shell中定义或赋值贰个变量:

    $ VARNAME=value
    
  • 小心等号两边都不能够有空格,不然会被Shell解释成命令行参数。

  • 一个变量定义后仅存在于如今Shell进程,它是本地变量,用export命令可以把当地变量导出为景况变量,定义和导出蒙受变量常常能够一步成功:

    $ export VARNAME=value
    
  • 也能够分两步成功:

    $ VARNAME=value
    $ export VARNAME
    
  • 用unset命令能够删除已定义的情状变量或本地变量。

    $ unset VARNAME
    
  • 假诺四个变量叫做VAENCORENAME,用'VA本田CR-VNAME'能够代表它的值,在不引起歧义的情形下也可以用VA索罗德NAME表示它的值。通过以下的例子比较那二种表示法的不如:

    $ echo $SHELL
    
  • 瞩目,在概念变量时毫无"'",取变量值时要用。和C语言区别的是,Shell变量没有要求断定概念类型,事实上Shell变量的值都以字符串,举个例子大家定义VA翼虎=45,其实VA翼虎的值是字符串45而非整数。Shell变量无需先定义后使用,假如一个未曾概念的变量取值,则值为空字符串。

grep与正则表明式

  1. 匹配行首,用元字符^
  1. 安装大小写,用-i

  2. 合营重复字符,用., *

  3. 转义符,用

  4. POSIX字符类

    类名 意义
    [:upper:] 表示大写字母[A~Z]
    [:lower:] 表示小写字母[a~z]
    [:digit:] 表示阿拉伯数字[0~9]
    [:alnum:] 表示大小写字母和阿拉伯数字
    [:space:] 表示空格键和TAB键
    [:alpha:] 表示大小写字母
    [:cntrl:] 表示Ctrl
    [:graph:]或[:print:] 表示ASCII码
    [:xdigit:] 表示16进制数字[09AFa~f]
  5. 标准相配:用<>

  6. 或字符,grep要求增多-E选项技术扶助它,用|表示

通配符

bash Shell本人不帮助正则表明式,使用正则表明式的是shell命令和工具,如grep,AWK,sed等。可是bash Shell能够行使正则表明式中的一些元字符完成通配。

符号 意义 示例 解释
* 任意字符 Phi*ip.rtf 以Phi开头,以ip.rtf结尾的文件
? 一个任意字符 ls -l 0?.pem 列出0开头且文件为两个字符的pem文件
[] 表示范围 ls -l [a-h].awk 列出以a-h开头的awk文件
{} 一组表达式的组合 ls -l {[a-h]*.awk,0?.pem} 匹配[a-h]*.awk或0?.pem的文件
^ 取反 ls -l [a-h]*.[^awk]* 以a-h开头,且不是awk类型的文件

指令代换

  • 由“`”反引号括起来的也是一条命令,Shell先进行该命令,然后将出口结果即时期换来当前命令行中。举个例子定义三个变量存放date命令的输出:

      $ DATE=`date`
      $ echo $DATE
    
  • 指令代换也得以用$()表示:

      $ DATE=$(date)
    

文本名代换(Globbing)

  • 那个用于相称的字符称为通配符(魏尔德card),如:*?[],具体如下:

    • *相配0个或四个随机字符
    • ?相配贰个Infiniti制字符
    • [若干字符]相配方括号中随便四个字符的一回出现

      $ ls /dev/ttyS*
      $ ls ch0?.doc
      $ ls ch0[0-2].doc
      $ ls ch[012][0-9].doc
      
    • 小心,Globbing所相称的文件名是由Shell张开的,也正是说在参数还没传给程序在此之前已经张开了,举个例子上述ls ch0[012].doc指令,借使当前目录下有ch00.doc和ch02.doc,则传给ls命令的参数实际上是那七个公文名,而不是叁个相配字符串。

grep命令族

grep: 标准grep命令

egrep: 扩张grep命令,援助中央和开始展览正则表达式

fgrep: 快捷grep命令,不帮忙正则表明式


Grep

到家查找正则表达式并把行打字与印刷出来(Global search Regular Expression and Print out the line)
grep [选项][模式][文件…]

算术代换

  • 使用$(()),用于算术总计,(())中的Shell变量取值将转变到整数,同样含义的$[]等价,例如:

      $ VAR=45
      $ echo $(($VAR 3))   等价于 echo $[VAR 3]或$[$VAR 3]
    
  • $(())中只可以用 -*/和()运算符,并且不得不做整数运算。

  • $[base#n],在那之中base表示进制,n遵照base进制解释,前边再运算数,按十进制解释。

      $ echo $[2#10 11]
      $ echo $[8#10 11]
      $ echo $[16#10 11]
    

指令代换

  • 由“`”反引号括起来的也是一条命令,Shell先进行该命令,然后将出口结果即时代换到当前命令行中。举例定义叁个变量存放date命令的输出:

    $ DATE=`date`
    $ echo $DATE
    
  • 指令代换也得以用$()表示:

    $ DATE=$(date)
    

sed命令

sed是贰个非交互式文本编辑器,它可对文本文件和行业内部输入实行编辑,标准输入能够是缘于键盘输入、文件重定向、字符串、变量,乃至来自管道的文件。sed适用于以下三中地方:

  • 编写制定相对交互式文本编辑器来讲太大的文件。
  • 编纂命令太复杂,在交互式文本编辑器中难以输入的意况。
  • 对文件扫描贰回,可是须求实行多少个编辑函数的场合。

选项

选项 意义 整词
-c 只输出匹配行的数量 count
-i 搜索时忽略大小写 ignore
-h 查询多文件时不显示文件名  
-l 只列出符合匹配的文件名,而不列出具体的匹配行 list
-n 列出所有的匹配行,并显示行号 number
-s 不显示不存在或无匹配文本的错误信息  
-v 显示不包含匹配文本的所有行 reverse
-w 匹配整词 word
-x 匹配整行  
-r 递归搜索,不仅搜索当前工作目录,而且搜索子目录 recursion
-q 禁止输出任何结果,以退出状态表示搜索是否成功 quit
-b 打印匹配行距文件头部的偏移量,以字节为单位 byte
-o 与-b选项结合使用,打印匹配的词距文件头部的偏移量,以字节为单位  
-E 支持扩展的正则表达式 Extract
-F 不支持正则表达式,按照字符串的字面意思进行匹配  

转义字符

  • 和C语言类似,在Shell中被看做转义字符,用于去除紧跟其后的单个字符的奇怪意义(回车除却),换句话说,紧跟其后的字符取字面值。比如:

      $ echo $SHELL
      /bin/bash
      $ echo $SHELL
      $SHELL
      $ echo \
      
    
  • 举个例子创制贰个文件名称叫"$ $"的公文($间含有空格),能够如此:

      $ touch $ $
    
  • 再有多少个字符即使不具备特别意义,不过要用它做文件名也很辛勤,正是-号。要是要创制贰个文本名以-号开头的文本,这样是不科学的:

      $ touch -hello
      touch:无效选项 -- e
      Try 'touch --help' for more information.
    
  • 正是加上转义也依然报错:

      $ touch -hello
      touch:无效选项 -- e
      Try 'touch --help' for more information.
    
  • 因为种种UNIX命令都把-号开关的命令行参数作为命令的选项,而不会作为文件名。,假若非要管理以-号初阶的文书名,恐怕有三种艺术:

      $ touch ./-hello
      或者
      $ touch -- -hello
    

算术代换

  • 利用$(()),用于算术总计,(())中的Shell变量取值将转变来整数,同样含义的$[]等价,例如:

    $ VAR=45
    $ echo $(($VAR 3))   等价于 echo $[VAR 3]或$[$VAR 3]
    
  • $(())中只可以用 -*/和()运算符,并且不得不做整数运算。

  • $[base#n],当中base表示进制,n依照base进制解释,前面再运算数,按十进制解释。

    $ echo $[2#10 11]
    $ echo $[8#10 11]
    $ echo $[16#10 11]
    

中央用法

sed只是对缓冲区神州始文件的别本实行编辑,并不编辑原始文本。假诺急需保留文件改变的内容,须求将出口重定向到另一个文件。

调用sed有二种方式,一种为Shell命令行格局,别的二种是将sed命令写入脚本文件,然后实践该脚本文件。

  1. 在Shell命令行输入指令调用sed,格式为sed [选项] 'sed命令' 输入文件
  2. sed一声令下插入脚本文件后,然后通过sed指令调用它,格式为sed [选项] -f sed 脚本文件 输入文件
  3. sed指令插入脚本文件后,最常用的章程是设置该脚本文件为能够实行,然后间接实践该脚本文件,格式为./sed脚本文件 输入文件

其三种办法脚本文件须要以sha-bang(#!)标记起始。无论哪类方法,假如未有一点点名输入文件,sed将从规范输入接收输入。常用选项有五个

选项 意义
-n 不打印所有的行到标准输出
-e 表示将下一个字符串解析为sed编辑命令,如果只传递一个,可以省略
-f 表示正在调用sed脚本文件

sed命令重要由定点文本行和sed编纂命令两某个构成,有二种办法固定文本:

  • 采用行号,内定一行,或然钦命行号范围
  • 用正则表达式
选项 意义
x x为指定行号
x,y 指定从x到y的行号范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 从pattern匹配行到x号行
x,/pattern/ 上一条反过来
x,y! 查询不包括x和y行号的行

编写制定命令

选项 意义
p 打印匹配行
= 打印文件行号
a 在定位行号后追加文本信息
i 在定位行号之前插入文本信息
d 删除定位行
c 用新文本替代定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 将文本写入到一个文件
y 变换字符
q 第一个模式匹配后退出
l 显示与八进制ASCII码等价的控制字符
{} 在定位行执行的命令组
n 读取下一个输入行,用下一个命令处理新的行
h 将模式缓冲区的文本复制到保持缓冲区
H ...追加到保持缓冲区
x 互换模式缓冲区和保持缓冲区内容
g 将保持模式缓冲区的内容复制到模式缓冲区
G ....追加到模式缓冲区

模式

字符串、变量、正则表达式

只顾:只要格局中涵盖空格,就供给接纳双引号将方式引入来

单引号

  • 和C语言同,Shell脚本中的单引号和双引号同样是字符串的界定符(双引号下一节介绍),而不是字符的界定符。单引号用于保障引号内装有字符的字面值,固然引号内的和回车也不例外,可是字符串中不可能冒出单引号。假若引号未有配对就输入回车,Shell会给出续行提醒符,须求用户把引号配上对。比方:

      $ echo '$SHELL'
      $SHELL
      $ echo 'ABC(回车)
      > DE'(再按一次回车结束命令)
      ABC
      DE
    

转义字符

  • 和C语言类似,在Shell中被看成转义字符,用于去除紧跟其后的单个字符的非常意义(回车除此之外),换句话说,紧跟其后的字符取字面值。譬喻:

    $ echo $SHELL
    /bin/bash
    $ echo $SHELL
    $SHELL
    $ echo \
    
    
  • 诸如创造三个文件名称为"$ $"的文本($间含有空格),能够如此:

    $ touch $ $
    
  • 还或者有贰个字符尽管不抱有非同小可含义,不过要用它做文件名也很麻烦,就是-号。假诺要创立二个文本名以-号开端的文书,那样是不准确的:

    $ touch -hello
    touch:无效选项 -- e
    Try 'touch --help' for more information.
    
  • 就算加上转义也依然报错:

    $ touch -hello
    touch:无效选项 -- e
    Try 'touch --help' for more information.
    
  • 因为各类UNIX命令都把-号开关的命令行参数作为命令的选项,而不会作为文件名。,假诺非要管理以-号先河的文件名,也会有二种办法:

    $ touch ./-hello
    或者
    $ touch -- -hello
    

示例

测试文件内容:

    This is a Certificate Request file:

    It should be mailed to zawu@seu.edu.cn

    =====================================================
    Certificate Subject:

    /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus

    The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
    To install this user certificate, please save this e-mail message into the following file.

    /home/alloy/linuxshell/CH02/usercert.pem

实例

-w和-x选项
grep命令方式协理正则表达式,正则表明式的元字符被解释成特别意义;
-w选项表示卓殊整词,即以方式的字面意思去解释
如:
grep cer* *.pem
grep -w cer* *.pem
-x 是相称整行
-w 使用不实惠,最棒和 -F 一齐行使

双引号

  • 被双引号用括住的内容,将被视为单一的字串。它防止通配符扩张,但允许变量扩展。这一点与单引号的管理格局差异

      $ DATE=$(date)
      $ echo "$DATE"
      $ echo '$DATE'
    
  • 再比如:

      $ VAR=200
      $ echo $VAR
      200
      $ echo '$VAR'
      $VAR
      $ echo "$VAR"
      200
    

单引号

  • 和C语言同,Shell脚本中的单引号和双引号同样是字符串的界定符(双引号下一节介绍),而不是字符的界定符。单引号用于维持引号内有着字符的字面值,固然引号内的和回车也不例外,但是字符串中不能够出现单引号。假诺引号未有配对就输入回车,Shell会给出续行提醒符,必要用户把引号配上对。譬如:

    $ echo '$SHELL'
    $SHELL
    $ echo 'ABC(回车)
    > DE'(再按一次回车结束命令)
    ABC
    DE
    

sed -n: 不打印sed编辑目标的全体内容

wsx@wsx-ubuntu:~/桌面$ sed -n '1p' input
    This is a Certificate Request file:

wsx@wsx-ubuntu:~/桌面$ sed '1p' input
    This is a Certificate Request file:
    This is a Certificate Request file:

    It should be mailed to zawu@seu.edu.cn

    =====================================================
    Certificate Subject:

    /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus

    The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
    To install this user certificate, please save this e-mail message into the following file.

    /home/alloy/linuxshell/CH02/usercert.pem

使用sed命令打字与印刷范围行:

wsx@wsx-ubuntu:~/桌面$ sed -n '3,6p' input 
    It should be mailed to zawu@seu.edu.cn

    =====================================================
    Certificate Subject:

grep命令族

grep
正式grep命令,帮衬中央正则表明式 egrep
扩大grep命令,支持主题和扩充正则表明式
等价于grep -E fgrep
快快grep命令,不帮衬正则表明式,依据字面意思举行相配
等价于grep -F

Shell脚本语法

双引号

  • 被双引号用括住的剧情,将被视为单一的字串。它制止通配符扩展,但允许变量扩充。这一点与单引号的管理方式差别

    $ DATE=$(date)
    $ echo "$DATE"
    $ echo '$DATE'
    
  • 再比如:

    $ VAR=200
    $ echo $VAR
    200
    $ echo '$VAR'
    $VAR
    $ echo "$VAR"
    200
    

sed -e: sed传递多少个编辑命令时行使

wsx@wsx-ubuntu:~/桌面$ sed -n '/Certificate/=' input 
1
6

wsx@wsx-ubuntu:~/桌面$ sed -n -e '/Certificate/p' input  -e '/Certificate/=' input
    This is a Certificate Request file:
1
    Certificate Subject:
6

sed

sed,stream editor,流编辑器,将一密密麻麻编写制定命令效率于一群文件文件
适用场地:

编纂相对交互式编辑器来讲太大的文书 编辑命令太复杂,在交互式文本编辑器中难以输入的状态 对文件扫描叁回,不过急需施行多个编辑函数的情景

二种调用格局

sed [选项] ‘sed命令’ 输入文件 sed [选项] -f sed脚本 输入文件 ./sed脚本文件 输入文件

标准测试

  • 命令test或[能够测试五个标准是或不是建立,借使测试结果为真,则该命令的Exit Status为0,如若测试结果为假,则下令的Exit Status为1(注意与C语言的逻辑表示正好相反)。比如测试五个数的分寸关系:

      $ var=2
      $ test $var -gt 1
      $ echo $?
      0
      $ test $var -gt 3
      $ echo $?
      1
    
  • 即使如此看起来很奇怪,但右臂括号[的确是二个发令的名字,传给命令的各参数之间应当用空格隔绝,譬如:$VA奥迪Q7、-gt、3、]和[命令的多少个参数,它们之间必须用空格隔开分离。命令test或[的参数格局是同等的,只然则test命令无需]参数。以[命令为例,常见的测试命令如下表所示:

      [ -d DIR ]                 如果DIR存在并且是一个目录则为真
      [ -f FILE ]                如果FILE存在且是一个普通文件则为真
      [ -z STRING ]              如果STRING的长度为零则为真
      [ -n STRING ]              如果STRING的长度非零则为真
      [ STRING1 = STRING2 ]      如果两个字符串相同则为真
      [ STRING1 != STRING2 ]     如果两个字符串不相同则为真
      [ ARG1 OP ARG2 ]           ARG1和ARG2应该是整数或者取值为整数的变量,
                                 OP的值有:
                                      -eq     等于
                                      -ne     不等于
                                      -lt     小于
                                      -le     小于等于
                                      -gt     大于
                                      -ge     大于等于
    
  • 和C语言类似,测试条件之间还能做与、或、非逻辑运算:

      [ ! EXPR ]           EXPR可以是上表中的任意一种测试条件, !表示"逻辑反(非)"
      [EXPR1 -a EXPR2 ]    EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示“逻辑与”
      [EXPR1 -o EXPR2 ]    EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示“逻辑或”
    
  • 例如:

      $ VAR=abc
      $ [ -d Desktop -a $VAR = 'abc' ]
      $ echo $?
      0
    
  • 只顾,假诺上例中的$VA中华V变量事先未有定义,则被Shell张开为空字符串,会招致测试条件的语法错误(张开为[ -d Desktop -a = 'abc']),作为一种好的Shell编制程序习贯,应该总是把变量取值放在双引号之中(展开为[ -d Desktop -a "" = 'abc'])

      $ unset VAR
      $ [ -d Desktop -a $VAR = 'abc' ]
      -bash: [: 参数太多
      $ [ -d Desktop -a "$VAR" = 'abc' ]
      $ echo $?
      1
    

Shell脚本语法

sed -f:调用sed脚本文件时才起效果

wsx@wsx-ubuntu:~/桌面$ sed '/file:/aWe append a new line.' input 
    This is a Certificate Request file:
We append a new line.

    It should be mailed to zawu@seu.edu.cn

    =====================================================
    Certificate Subject:

    /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus

    The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
    To install this user certificate, please save this e-mail message into the following file.

    /home/alloy/linuxshell/CH02/usercert.pem

本子用法:

#! /bin/sed -f 
/file:/a       #a表示在此处添加文本

# 添加文本
We append a new line.
We append a another line.

sed基本编辑命令能够献身单引号内,也可放在单引号外。

选项

选项 意义
-n 不打印所有行到标准输出
-f 表示正在调用sed脚本文件
-e 表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,可以省略-e

分支

  • if/then/elif/else/fi

    • 和C语言类似,在Shell中用if、then、elif、else、fi这几条命令达成分支调整。这种流程序调控制语句本质上也是由若干条Shell命令组成的,举例在此在此以前讲过的

        if [ -f ~/.bashrc ]; then
            . ~/.bashrc
        fi
      
    • 其实是三条命令,if [ -f ~/.bashrc ]是首先条,then . ~/.bashrc是第二条,fi是第三条。假若两条命令写在同一行则必要用;号隔开,一行只写一条命令就没有要求写;号了,此外,then前面有换行,但这条命令没写完,Shell会自动续行,把下一行接在then前面当作一条命令管理。和[指令同样,要小心命令和各参数之间必须用空格隔绝。if命令的参数组成一条子命令,尽管该子命令的Exit Status为0(表示真),则施行then前面包车型地铁子命令上,假设Exit Status非0(表示假),则试行elif、else也许fi后边的子命令。if前面包车型地铁子命令常常是测试命令,但也可以是别的命令。Shell脚本没有{}括号,所以用fi表示if语句的了断。见下例:

        #! /bin/sh
      
        if [ -f /bin/bash ]
        then
            echo "/bin/bash is a file"
        else
            echo "/bin/bash is NOT a file"
        fi
        if :; then echo "always true"; fi
      
    • ":"是三个非正规的授命,称为空命令,该命令不做任何事,但Exit Status总是真。此外,也足以实行/bin/true或/bin/false获得真或假的Exit Status。再看一个事例:

        #! /bin/sh
      
        echo "Is it morning? Please answer yes or no."
        read YES_OR_NO
        if [ "$YES_OR_NO" = "yes" ]; then
            echo "Good morning!"
        elif [ "$YES_OR_NO" = "no" ]; then
            echo "Good afternoon!"
        else
            echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
            exit 1
        fi
        exit 0
      
    • 上例中的read命令的效益是之类用户输入一行字符串,将该字符串存到三个Shell变量中。

    • 除此以外,Shell还提供了&&和||语法,和C语言类似,具备Short-circuit性子,多数Shell脚本喜欢写成这么:

        test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1)
      
    • &&也正是“if...then...”,而||也正是“if not...then...”。&&和||用于连接多个指令,而地点讲的-a和-o仅用于在测试表达式中一而再五个测试条件,要留心它们的不一样,举个例子:

        test "$VAR" -gt 1 -a "$VAR" -lt 3
      
    • 和以下写法是等价的

        test "$VAR" -gt 1 && test "$VAR" -lt 3
      
  • case/esac

    • case命令可类比C语言的switch/case语句,esac代表case语句块的终止。C语言的case只可以合营整形或字符型常量表明式,而Shell脚本的case能够般配字符串和魏尔德card,每种匹配分支能够有若干条命令,末尾必须以;;停止,推行时找到第贰个地位特别的道岔并进行相应的命令,然后径直跳到esac之后,不需求像C语言同样用break跳出。

        #! /bin/sh
      
        echo "Is it morning? Please answer yes or no."
        read YES_OR_NO
        case "$YES_OR_NO" in
        yes|y|Yes|YES)
            echo "Good Morning!";;
        [nN]*)
            echo "Good Afternoon!";;
        *)
            echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
            exit 1;;
        esac
        exit 0
      
    • 运用case语句的事例能够在系统服务的台本目录/etc/init.d中找到。这么些目录下的脚本多数具备这种样式(以/etc/init.d/nfs-kernel-server为例):

        case "$1" in 
            start)
                ...
            ;;
            stop)
                ...
            ;;
            status)
                ...
            ;;
            reload | force-reload)
                ...
            ;;
            restart)
                ...
            ;;
            *)
                log_sucess_msg "Usage: nfs-kernel-server {start|stop|status|reload|force-reload|restart}"
                exit 1
            ;;
        esac
      
    • 开端nfs-kernel-server服务的吩咐是

        $ sudo /etc/init.d/nfs-kernel-server start
      
    • $1是三个奇特变量,在施行脚本时自动取值为第三个命令行参数,约等于start,所以进入start)分支施行相关的吩咐。同理,命令行参数钦命为stop、reload或restart可以进来其它分支推行停止服务、重新加载配置文件或另行开动服务的有关命令。

规范化测试

  • 命令test或[能够测试多少个口径是不是建设构造,假如测试结果为真,则该命令的Exit Status为0,若是测试结果为假,则下令的Exit Status为1(注意与C语言的逻辑表示正好相反)。举个例子测试多少个数的轻重缓急关系:

    $ var=2
    $ test $var -gt 1
    $ echo $?
    0
    $ test $var -gt 3
    $ echo $?
    1
    
  • 虽说看起来很想获得,但左侧括号[真正是八个限令的名字,传给命令的各参数之间应当用空格隔离,比方:$VA昂科威、-gt、3、]和[命令的八个参数,它们之间必须用空格隔开分离。命令test或[的参数方式是一律的,只然则test命令无需]参数。以[指令为例,常见的测试命令如下表所示:

    [ -d DIR ]                 如果DIR存在并且是一个目录则为真
    [ -f FILE ]                如果FILE存在且是一个普通文件则为真
    [ -z STRING ]              如果STRING的长度为零则为真
    [ -n STRING ]              如果STRING的长度非零则为真
    [ STRING1 = STRING2 ]      如果两个字符串相同则为真
    [ STRING1 != STRING2 ]     如果两个字符串不相同则为真
    [ ARG1 OP ARG2 ]           ARG1和ARG2应该是整数或者取值为整数的变量,
                               OP的值有:
                                    -eq     等于
                                    -ne     不等于
                                    -lt     小于
                                    -le     小于等于
                                    -gt     大于
                                    -ge     大于等于
    
  • 和C语言类似,测试条件之间还是可以做与、或、非逻辑运算:

    [ ! EXPR ]           EXPR可以是上表中的任意一种测试条件, !表示"逻辑反(非)"
    [EXPR1 -a EXPR2 ]    EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示“逻辑与”
    [EXPR1 -o EXPR2 ]    EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示“逻辑或”
    
  • 例如:

    $ VAR=abc
    $ [ -d Desktop -a $VAR = 'abc' ]
    $ echo $?
    0
    
  • 瞩目,要是上例中的$VA中华V变量事先未有定义,则被Shell打开为空字符串,会变成测试条件的语法错误(张开为[ -d Desktop -a = 'abc']),作为一种好的Shell编制程序习于旧贯,应该总是把变量取值放在双引号之中(展开为[ -d Desktop -a "" = 'abc'])

    $ unset VAR
    $ [ -d Desktop -a $VAR = 'abc' ]
    -bash: [: 参数太多
    $ [ -d Desktop -a "$VAR" = 'abc' ]
    $ echo $?
    1
    

sed文本定位的一组例子

  1. 相配元字符,用转义符打开遮掩

    wsx@wsx-ubuntu:~/桌面$ sed -n '/./p' input 
     It should be mailed to zawu@seu.edu.cn
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
     /home/alloy/linuxshell/CH02/usercert.pem
    
  2. 选拔元字符实行相称

    $在sed命令中象征最终一行

    wsx@wsx-ubuntu:~/桌面$ sed -n '$p' input
     /home/alloy/linuxshell/CH02/usercert.pem
    
  3. !标识,打字与印刷不在2-10的行

    wsx@wsx-ubuntu:~/桌面$ sed -n '2,10!p' input 
     This is a Certificate Request file:
     To install this user certificate, please save this e-mail message into the following file.
    
     /home/alloy/linuxshell/CH02/usercert.pem
    
  4. 应用行号和重大字相称限定行范围

    wsx@wsx-ubuntu:~/桌面$ sed -n '/seugrid/,$p' input 
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
    
     /home/alloy/linuxshell/CH02/usercert.pem
    

sed命令

一般性由确定地点文本行和sed编辑命令两部分组成,sed编辑命令对稳固文本行进行各个管理

循环

  • for/do/done

    • Shell脚本的for循环结商谈C语言很不雷同,它好像于少数编制程序语言foreach循环。举例:

        #! /bin/sh
      
        for FRUIT in apple banana pear; do
            echo "I like $FRUIT"
        done
      
    • FRUIT是贰个循环变量,第二回循环$FRUIT的取值是apple,第三遍取值是banana,第三遍取值是pear。再比方说,要将当前目录下的chap0、chap1、chap2等文件夹名改为chap0~、chap1~、chap2~等(按惯例,末尾有~字符的公文名代表不经常文件),这些命令能够这么写:

        $ for FILENAME in chap?; do mv $FILENAME $FILENAME~; done
      
    • 也能够这么写:

        $ for FILENAME in `ls chap?`; do mv $FILENAME $FILENAME~; done
      
  • while/do/done

    • while的用法和C语言类似。比如贰个验证码的台本:

        #! /bin/sh
      
        echo "Enter password:"
        read TRY
        while [ "$TRY" != "secret" ]; do
            echo "Sorry, try again"
            read TRY
        done
      
    • 上面包车型地铁事例通过算术运算调整循环的次数:

        #! /bin/sh
      
        COUNTER=1
        while [ "$COUNTER" -lt 10 ]; do
            echo "Here we go again"
            COUNTER=$[$COUNTER 1]
        done
      
    • 另,Shell还应该有until循环,类似C语言的do...while。如有兴趣可在课后机关扩张学习。

  • break和continue

    • break[n]可以钦定跳出几层循环;continue跳过此番巡回,但不会跳出循环。
    • 即break跳出,continue跳过。
    • 演练:将地方表明密码的主次修改一下,假若用户输错八回密码就报错退出。

分支

  • if/then/elif/else/fi

    • 和C语言类似,在Shell中用if、then、elif、else、fi这几条命令实现分支调节。这种流程序调节制语句本质上也是由若干条Shell命令组成的,譬喻在此以前讲过的

      if [ -f ~/.bashrc ]; then
          . ~/.bashrc
      fi
      
    • 实则是三条命令,if [ -f ~/.bashrc ]是第一条,then . ~/.bashrc是第二条,fi是第三条。如若两条命令写在同一行则要求用;号隔离,一行只写一条命令就没有须要写;号了,其它,then后边有换行,但那条命令没写完,Shell会自动续行,把下一行接在then前边当作一条命令管理。和[命令同样,要留心命令和各参数之间必须用空格隔开分离。if命令的参数组成一条子命令,假诺该子命令的Exit Status为0(表示真),则执行then后边的子命令上,倘若Exit Status非0(表示假),则实践elif、else也许fi前边的子命令。if前边的子命令日常是测试命令,但也能够是其它命令。Shell脚本未有{}括号,所以用fi表示if语句的收尾。见下例:

      #! /bin/sh
      
      if [ -f /bin/bash ]
      then
          echo "/bin/bash is a file"
      else
          echo "/bin/bash is NOT a file"
      fi
      if :; then echo "always true"; fi
      
    • ":"是一个特种的下令,称为空命令,该命令不做此外交事务,但Exit Status总是真。其它,也足以推行/bin/true或/bin/false获得真或假的Exit Status。再看一个例证:

      #! /bin/sh
      
      echo "Is it morning? Please answer yes or no."
      read YES_OR_NO
      if [ "$YES_OR_NO" = "yes" ]; then
          echo "Good morning!"
      elif [ "$YES_OR_NO" = "no" ]; then
          echo "Good afternoon!"
      else
          echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
          exit 1
      fi
      exit 0
      
    • 上例中的read命令的效用是之类用户输入一行字符串,将该字符串存到一个Shell变量中。

    • 其余,Shell还提供了&&和||语法,和C语言类似,具备Short-circuit个性,繁多Shell脚本喜欢写成那样:

      test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1)
      
    • &&相当于“if...then...”,而||也正是“if not...then...”。&&和||用于连接七个指令,而地点讲的-a和-o仅用于在测试表达式中一连五个测试条件,要留心它们的分别,比如:

      test "$VAR" -gt 1 -a "$VAR" -lt 3
      
    • 和以下写法是等价的

      test "$VAR" -gt 1 && test "$VAR" -lt 3
      
  • case/esac

    • case命令可类比C语言的switch/case语句,esac表示case语句块的利落。C语言的case只好合作整形或字符型常量表达式,而Shell脚本的case能够相称字符串和Wildcard,每种相称分支能够有多少条命令,末尾必须以;;截至,实行时找到第一个万分的分支并实行相应的授命,然后径直跳到esac之后,无需像C语言同样用break跳出。

      #! /bin/sh
      
      echo "Is it morning? Please answer yes or no."
      read YES_OR_NO
      case "$YES_OR_NO" in
      yes|y|Yes|YES)
          echo "Good Morning!";;
      [nN]*)
          echo "Good Afternoon!";;
      *)
          echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
          exit 1;;
      esac
      exit 0
      
    • 运用case语句的例子能够在系统服务的台本目录/etc/init.d中找到。那些目录下的脚本好些个具备这种样式(以/etc/init.d/nfs-kernel-server为例):

      case "$1" in 
          start)
              ...
          ;;
          stop)
              ...
          ;;
          status)
              ...
          ;;
          reload | force-reload)
              ...
          ;;
          restart)
              ...
          ;;
          *)
              log_sucess_msg "Usage: nfs-kernel-server {start|stop|status|reload|force-reload|restart}"
              exit 1
          ;;
      esac
      
    • 起步nfs-kernel-server服务的下令是

      $ sudo /etc/init.d/nfs-kernel-server start
      
    • $1是一个特别变量,在试行脚本时自动取值为第多少个命令行参数,也等于start,所以进入start)分支推行相关的下令。同理,命令行参数钦定为stop、reload或restart能够进入其余分支推行结束服务、重新加载配置文件或另行起动服务的相干命令。

sed基本编辑命令的一组例子

  1. 布置文本:运行脚本,以输入文件名作为参数

    #!/bin/sed -f
    /file:/i             # i表示此处换行插入文本
    We insert a new line.
    
  2. 修改文件

    #!/bin/sed -f
    
    /file:/c             #c表示此处换行修改文本
    We modify this line      #修改文本内容
    
  3. 剔除文本,符号是d,不带,与其它命令有所差距,非常灵活。下边删除第一行和最终一行。

    wsx@wsx-ubuntu:~/桌面$ sed '1d' input
    
     It should be mailed to zawu@seu.edu.cn
    
     =====================================================
     Certificate Subject:
    
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
    
     /home/alloy/linuxshell/CH02/usercert.pem
    wsx@wsx-ubuntu:~/桌面$ sed '$d' input
     This is a Certificate Request file:
    
     It should be mailed to zawu@seu.edu.cn
    
     =====================================================
     Certificate Subject:
    
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
    
  4. 轮换文本,格式s/被替换的字符串/新字符串/[替换选项]

    选项 意义
    g 全局匹配替换(替换所有的)
    p 与-n选项结合,只打印替换行
    w 文件名 表示将输出定向到一个文件
    sx@wsx-ubuntu:~/桌面$ sed 's/Certificate/CERTIFICATE/' input
     This is a CERTIFICATE Request file:
    
     It should be mailed to zawu@seu.edu.cn
    
     =====================================================
     CERTIFICATE Subject:
    
     /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certificate subject, and t uniquely identifies theis user. $88
     To install this user certificate, please save this e-mail message into the following file.
    
     /home/alloy/linuxshell/CH02/usercert.pem
    wsx@wsx-ubuntu:~/桌面$ sed -n 's/Certificate/CERTIFICATE/p' input
     This is a CERTIFICATE Request file:
     CERTIFICATE Subject:
    
  5. 写入到一个新文件

    wsx@wsx-ubuntu:~/桌面$ sed -n 's/Certificate/CERTIFICATE/pg' input
     This is a CERTIFICATE Request file:
     CERTIFICATE Subject:
    wsx@wsx-ubuntu:~/桌面$ 
    wsx@wsx-ubuntu:~/桌面$ sed -n '1,5 w output' input
    wsx@wsx-ubuntu:~/桌面$ cat output 
     This is a Certificate Request file:
    
     It should be mailed to zawu@seu.edu.cn
    
     =====================================================
    
  6. 从文件中可读入文本,格式指定地址 r 文件名

  7. 退出命令:q

  8. 调换命令:sed命令的y意味着字符转变(不等长时会报错)

    wsx@wsx-ubuntu:~/桌面$ sed 'y/fmj/FMJ/' input 
     This is a CertiFicate Request File:
    
     It should be Mailed to zawu@seu.edu.cn
    
     =====================================================
     CertiFicate SubJect:
    
     /O=Grid/OU=GlobusTest/OU=siMpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
    
     The above string is known as your user certiFicate subJect, and t uniquely identiFies theis user. $88
     To install this user certiFicate, please save this e-Mail Message into the Following File.
    
     /hoMe/alloy/linuxshell/CH02/usercert.peM
    
  9. 来得调控字符:调节字符便是非打字与印刷字符,如退格键、F1键等。使用sed l命令。

  10. 在命令行推行命令组,用{}符号,与-e分选功效相近。

    wsx@wsx-ubuntu:~/桌面$ sed -n '/Certificate/{p;=}' input
        This is a Certificate Request file:
    1
        Certificate Subject:
    6
    

sed定位文本行

选项 意义
x x为指定行
x,y 指定行范围
/pattern/ 包含模式的行
/pattern/pattern/ 包含两个模式的行
/pattern/,x 从与pattern的匹配行到x之间的行
x,/pattern/ 从x开始到pattern的匹配行
x,y! 不包括x和y的行

岗位参数和异样变量

  • 有那些奇异变量是被Shell自动赋值的,我们早已碰着了$?和$1。其余常用的职务参数和新鲜变量在此地计算一下:

      $0           相当于C语言main函数的argv[0]
      $1、$2...    这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]...
      $#           相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
      $@           表示参数"$1" "$2" ...,例如可以用在for循环中的in后面 
      $*           表示参数"$1" "$2" ...,同上
      $?           上一条命令的Exit Status
      $$           当前进程号
    
  • 岗位参数能够用shift命令左移。举例shift 3表示原来的$4未来成为$1,原本的$5将来成为$2等等,原本的$1、$2、$3扬弃,$0不活动。不带参数的shift命令也正是shift 1。举个例子:

      #! /bin/sh
    
      echo "The program $0 is now running"
      echo "The first parameter is $1"
      echo "The second parameter is $2"
      echo "The parameter list is $@"
      shift
      echo "The first parameter is $1"
      echo "The second parameter is $2"
      echo "The parameter list is $@"
    

循环

  • for/do/done

    • Shell脚本的for循环结商谈C语言很不相同,它好像于有个别编制程序语言foreach循环。比如:

      #! /bin/sh
      
      for FRUIT in apple banana pear; do
          echo "I like $FRUIT"
      done
      
    • FRUIT是三个循环变量,第二遍循环$FRUIT的取值是apple,第二回取值是banana,第叁次取值是pear。再举例,要将当前目录下的chap0、chap1、chap2等公事夹名改为chap0~、chap1~、chap2~等(按惯例,末尾有~字符的文件名代表一时文件),这么些命令能够这么写:

      $ for FILENAME in chap?; do mv $FILENAME $FILENAME~; done
      
    • 也能够那样写:

      $ for FILENAME in `ls chap?`; do mv $FILENAME $FILENAME~; done
      
  • while/do/done

    • while的用法和C语言类似。举例贰个验证码的脚本:

      #! /bin/sh
      
      echo "Enter password:"
      read TRY
      while [ "$TRY" != "secret" ]; do
          echo "Sorry, try again"
          read TRY
      done
      
    • 下边包车型客车例证通过算术运算调节循环的次数:

      #! /bin/sh
      
      COUNTER=1
      while [ "$COUNTER" -lt 10 ]; do
          echo "Here we go again"
          COUNTER=$[$COUNTER 1]
      done
      
    • 另,Shell还恐怕有until循环,类似C语言的do...while。如有兴趣可在课后活动扩充学习。

  • break和continue

    • break[n]能够钦赐跳出几层循环;continue跳过本次巡回,但不会跳出循环。
    • 即break跳出,continue跳过。
    • 演练:将上边表明密码的次第修改一下,借使用户输错陆遍密码就报错退出。

awk编程

awk是三人长辈开拓的编程语言,awk是几人创小编的首字母。基本语言与C类似。

最近,使用的是gawk,Linux系统中/bin目录下有awkgawk四个指令,前者实际上是后世的链接。利用gawk言语可以完成多少检索、抽出文件中的数据、成立管道流命令等效果。

大家得以差相当的少地将awk编制程序模型分位七个品级:

  • 读输入文件进行的实施代码段(由BEGIN关键字标记)
  • 读取输入文件时举办代码段
  • 读输入文件从此的实行代码段(由END关键字标志)

调用方法分为二种:Sehll命令行格局;脚本施行。

sed编辑命令

sed编辑命令标示对文件进行何种处理,如打字与印刷,删除,追加,插入,替换等

选项 意义
p 打印匹配行
= 打印文件行号
d 删除定位行
a 在定位行号之后追加文本
i 在定位行号之前插入文本
c 用新文本替换定位文本行
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 将文本写入另一个文本
y 变换字符
q 第一个模式匹配完成后退出
l 显示与八进制ASCII码等价的控制字符
{} 在定位行执行的命令组
n 读取下一个输入行,用下一个命令处理新的行
h 将模式缓冲区的文本复制到保持缓冲区
H 将模式缓冲区的文本追加到保持缓冲区
x 交换模式缓冲区和保持缓冲区
g 将保持缓冲区文本复制到模式缓冲区
G 将保持缓冲区文本追加到模式缓冲区

输入输出

  • echo

    • 呈现文本行或变量,只怕把字符串输入到文件。

        echo [option] string
        -e 解析转义字符
        -n 不回车换行。默认情况echo回显的内容后面跟一个回车换行。
        echo "hellonn"
        echo -e "hellonn"
        echo "hello"
        echo -n "hello"
      
  • 管道

    • 可以透过 | 把四个限令的出口传递给另二个限令做输入。

        cat myfile | more
        ls -l | grep "myfile"
        df -k | awk '{print $1}' | grep -v "文件系统"
        df -k 查看磁盘空间,找到第一列,去除“文件系统”,并输出
      
  • tee

    • tee命令把结果输出到标准输出,另八个别本输出到对应文件。

        df -k | awk '{print $1}' | grep -v "文件系统" | tee a.txt
      
    • tee -a a.txt表示追加操作。

        df -k | awk '{print $1}' | grep -v "文件系统" | tee -a a.txt        
      
  • 文本重定向

      cmd > file              把标准输出重定向到新文件中
      cmd >> file             追加
      cmd > file2 2>&1        标准出错也重定向到1所指向的file里
      cmd >> file2 2>&1       
      cmd < file1 > file2     输入输出都定向到文件里
      cmd < &fd               把文件描述符fd作为标准输入
      cmd > &fd               把文件描述符fd作为标准输出
      cmd < &-                关闭标准输入
    

职位参数和非凡变量

  • 有无数破例变量是被Shell自动赋值的,大家已经遭逢了$?和$1。其余常用的地方参数和杰出变量在此处总计一下:

    $0           相当于C语言main函数的argv[0]
    $1、$2...    这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]...
    $#           相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
    [email protected]           表示参数"$1" "$2" ...,例如可以用在for循环中的in后面 
    $*           表示参数"$1" "$2" ...,同上
    $?           上一条命令的Exit Status
    $$           当前进程号
    
  • 岗位参数可以用shift命令左移。比方shift 3表示原本的$4今后改为$1,原本的$5今后成为$2等等,原本的$1、$2、$3遗弃,$0不运动。不带参数的shift命令也等于shift 1。举个例子:

    #! /bin/sh
    
    echo "The program $0 is now running"
    echo "The first parameter is $1"
    echo "The second parameter is $2"
    echo "The parameter list is [email protected]"
    shift
    echo "The first parameter is $1"
    echo "The second parameter is $2"
    echo "The parameter list is [email protected]"
    

awk格局相称

别的awk语句都由情势和动作结合。格局是一组用于测试输入行是否须求推行动作的规则,动作是带有语句、函数和表明式的施行进程。awk帮助具备的正则表明式元字符,以及? 五个扩张元字符。

wsx@wsx-ubuntu:~/桌面$ awk '/^$/{print "This is a blank line."}' input
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.

单引号中间为awk命令,由两有的构成,以“/”符号分隔,^$是形式,花括号部分是动作。该awk表示一旦读入的输入文件是空行,就打印前边的字符串This is a blank line

应用脚本(将指令输入四个文书中):

wsx@wsx-ubuntu:~/桌面$ awk -f src.awk input
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.
This is a blank line.

剧情不仅那一个,大家先谈谈其余概念。

实例

sed -n ‘1p’ file sed -e ‘/^f*/p’ -e ‘/^f*/=’ file 定位命令
相称元字符
sed -n ‘/./p’ input
sed -n ‘/$/p’ input 使用元字符进行相配
sed -n ‘p′input(注意:在sed命令中象征最终一行)
sed -n ‘/^$/p’ input (相称空行)
sed -n ‘/.*bus/p’ input !符号
sed -n ‘2,10!p’ input 使用行号与重大字相配限定行范围
sed -n ‘/seugrid/,$p’ input
sed -n ‘3,/seugrid/p’ input

编排命令

安顿文本
sed ‘钦命地址itext’ input (在钦点地点此前插入)
sed ‘钦命地址atext’ input (在内定地点然后插入)
sed ‘/i/iinputnsecond’ (插入两行input和second)
sed ‘/i/ainputnsecond’ 修改文件
sed ‘钦点地址ctext’ input (将全数相配行修改为新文本行)
sed ‘/Certificate/cNew line:’ input 删除文本
sed ‘钦点位置d’ input (删除钦点行) 替换文本
sed ‘s/被替换字符串/新字符串/[轮换选项]’
sed ‘s/被替换字符串/新字符串/number[轮换选项]’(表示第number(1~512)次匹配)

选项 意义
g 全部替换
p 与-n选项结合,只打印替换行
w 文件名 表示将输出定向到一个文件

写入新文件
sed ‘指定地点w file’ input
sed ‘1,5w file’ input
sed ‘/Certificate/w file’ input 从文件读入文本
sed ‘钦赐地址r file’ input 退出命令
sed ‘钦定地方q’ input 转变命令
sed ‘y/被轮换字符种类/转变的字符系列/’ 输入文件
七个类别长度必须一律
sed ‘y/fmg/FMG/’ input 显示调整字符
来得退格符,F1键,shift键等
sed -n l input
sed -n ‘钦点地点l’ input 在固定行推行命令组
sed -n -e ‘/Certificate/p’ -e ‘/Certificate/=’ input
sed -n ‘/Certificate/{p;=}’ input 高端编辑命令
管理相配行的下一行
sed ‘/Certificate/{n;s/11/99/;}’ input sed缓冲区的拍卖
sed ‘/Subject/h;/seugrid/x;$G’ input
1.相配Subject,并将相称行写入保持缓冲区
2.相称seugrid,将维持缓冲区和形式缓冲区调换
3.到结尾行,将维持缓冲区追加到格局缓冲区 利用分号分隔多个编辑命令
上例已经使用了这种代表

函数

  • 和C语言类似,Shell中也可以有函数的定义,但是函数定义中一直不再次回到值也未曾子数列表。举个例子:

      #/bin/sh
    
      foo(){ echo "Function foo is called"; }
    
      echo "-=start=-"
      foo
      echo "-=end=-"
    
  • 留神函数体的左花括号{和前边的通令之间必须有空格或换行,借使将最终一条命令和右花括号}写在一行,命令末尾必须有分集团;但,不建议将函数定义的写在一行上,不便利脚本阅读。

  • 在定义foo()函数时并不推行函数体中的命令,就象定义变量同样,只是给foo这些名一个定义,到末端调用foo函数的时候(注意Shell中的函数调用不写括号)才实行函数体中的命令。Shell脚本中的函数必须先定义后调用,一般把函数定义语句写在本子的前方,把函数调用和别的命令写在剧本的最后(类似C语言中的main函数,这才是全方位脚本实际初始实行命令的地点)。
  • Shell函数未有参数列表并不代表不可能传参数,事实上,函数就象是Mini脚本,调用函数时得以传任意个参数,在函数内部同样是用$0、$1、$2等变量来领取参数,函数中的地点参数也正是函数的有些变量,改造那些变量并不会影响外面包车型客车$0、$1、$2等变量。函数中得以用return命令归来,假如return前面跟三个数字则表示函数的Exit Status。
  • 上边这一个剧本能够三次创造八个目录,各目录名经过命令行参数字传送入,脚本各种测试各目录是不是存在,假使目录不设有,首先打字与印刷消息然后试着成立该目录。

      #! /bin/sh
      is_directory(){
          DIR_ANME=$1
          if [ ! -d $DIR_ANME ]
              return 1
          else
              return 0
          fi
      }
    
      for DIR in "$@"; do
          if is_directory "$DIR"
          then : 
          else
              echo "$DIR doesn't exist, Creating it now..."
              mkdir $DIR > /dev/null 2>&1
              if [ $? -ne 0 ]; then
                  echo "Cannot create directory $DIR"
                  exit 1
              fi
          fi
      done
    
  • 注意:is_directory返回0表示真,返回1表示假

输入输出

  • echo

    • 彰显文本行或变量,只怕把字符串输入到文件。

      echo [option] string
      -e 解析转义字符
      -n 不回车换行。默认情况echo回显的内容后面跟一个回车换行。
      echo "hellonn"
      echo -e "hellonn"
      echo "hello"
      echo -n "hello"
      
  • 管道

    • 能够经过 | 把一个发令的出口传递给另三个限令做输入。

      cat myfile | more
      ls -l | grep "myfile"
      df -k | awk '{print $1}' | grep -v "文件系统"
      df -k 查看磁盘空间,找到第一列,去除“文件系统”,并输出
      
  • tee

    • tee命令把结果输出到正式输出,另二个别本输出到相应文件。

      df -k | awk '{print $1}' | grep -v "文件系统" | tee a.txt
      
    • tee -a a.txt表示追加操作。

      df -k | awk '{print $1}' | grep -v "文件系统" | tee -a a.txt        
      
  • 文本重定向

    cmd > file              把标准输出重定向到新文件中
    cmd >> file             追加
    cmd > file2 2>&1        标准出错也重定向到1所指向的file里
    cmd >> file2 2>&1       
    cmd < file1 > file2     输入输出都定向到文件里
    cmd < &fd               把文件描述符fd作为标准输入
    cmd > &fd               把文件描述符fd作为标准输出
    cmd < &-                关闭标准输入
    

笔录和域

awk感到输入文件是结构化的,awk将每一种输入文件行定义为记录,行中的每贰个字符串定义为域,域之间用空格、TAB键或别的标记进行分隔,分隔域的暗号就叫分隔符。(那一个结构化概念须要领会,诸多命令和编制程序中都有关联)

wsx@wsx-ubuntu:~/桌面$ awk '{print $2,$1,$4,$3}' sturecord 
Hao Li 025------------ njue
Ju Zhang 025---------- nju
Bin Wang 025------ seu
wsx@wsx-ubuntu:~/桌面$ awk '{print $0}' sturecord 
Li Hao  njue 025------------ 
Zhang Ju    nju 025---------- 
Wang Bin    seu 025------

可以由此对域的操作对文本进行重新排列,也得以用print $0输入全体域。

wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {one=1;two=2}{print $(one two)}' sturecord 
njue
nju
seu

BEGIN字段中定义onetwo多个变量并赋值。

-F慎采用来改造分隔符,比如只以't'为分隔符。

wsx@wsx-ubuntu:~/桌面$ awk -F't' '{print $2}' sturecord 
025------------ 
025---------- 
025------

注意-F-f的区别。

awk还提供了另一种更便于的措施更换分隔符。

wsx@wsx-ubuntu:~/桌面$ cat sturecord 
Li Hao,njue,025------------ 
Zhang Ju,nju,025---------- 
Wang Bin,seu,025------
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=","}{print $1, $3}' sturecord 
Li Hao 025------------ 
Zhang Ju 025---------- 
Wang Bin 025------

AWK

awk的主导语法与C语言类似,与sed的效益看似,用来拍卖文件,awk能够从文件或字符串中基于钦点规则浏览和抽出音信,在抽出消息的根底上,技艺张开其它文件操作
风行的awk是gawk,能够完成数据检索,收取文件中数量,创制管道流命令

Shell脚本调节和测试方法

  • Shell提供了一部分用来调节和测试脚本的选项,如:

      -n      读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。
      -v      一边执行脚本, 一边将执行过的脚本命令打印到标准错误输出。
      -x      提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。
    
  • 这一个选取有两种广泛的利用办法:

  • 1、在命令行提供参数。如:

      $ sh -x ./script.sh
    
  • 2、在本子按键提供参数。如:

      #! /bin/sh -x
    
  • 3、在本子中用set命令运转或剥夺参数。如:

      #! /bin/sh
    
      if [ -z "$1" ]; then
          set -x
          echo "ERROR: Insufficient Args."
          exit 1
          set  x
      fi
    
  • set -x和set x分别代表启用或剥夺-x参数,那样能够只对剧本中的某一段进展追踪调节和测试。

函数

  • 和C语言类似,Shell中也可能有函数的定义,然而函数定义中并未有重回值也尚无参数列表。比方:

    #/bin/sh
    
    foo(){ echo "Function foo is called"; }
    
    echo "-=start=-"
    foo
    echo "-=end=-"
    
  • 只顾函数体的左花括号{和后边的命令之间必须有空格或换行,如果将最后一条命令和右花括号}写在一行,命令末尾必须有根据地;但,不建议将函数定义的写在一行上,不便利脚本阅读。

  • 在定义foo()函数时并不施行函数体中的命令,就象定义变量同样,只是给foo那么些名多个定义,到前边调用foo函数的时候(注意Shell中的函数调用不写括号)才实行函数体中的命令。Shell脚本中的函数必须先定义后调用,一般把函数定义语句写在本子的前面,把函数调用和任何命令写在剧本的末梢(类似C语言中的main函数,那才是任何脚本实际开端试行命令的地点)。

  • Shell函数未有参数列表并不表示不能够传参数,事实上,函数就象是迷你脚本,调用函数时方可传任性个参数,在函数内部同样是用$0、$1、$2等变量来领取参数,函数中的地点参数也就是函数的一部分变量,改造那个变量并不会影响外面的$0、$1、$2等变量。函数中得以用return命令归来,假如return前边跟七个数字则意味函数的Exit Status。
  • 上边这些本子能够二回创造多少个目录,各目录名经过命令行参数字传送入,脚本每个测试各目录是不是存在,假如目录不存在,首先打印消息然后试着创设该目录。

    #! /bin/sh
    is_directory(){
        DIR_ANME=$1
        if [ ! -d $DIR_ANME ]
            return 1
        else
            return 0
        fi
    }
    
    for DIR in "[email protected]"; do
        if is_directory "$DIR"
        then : 
        else
            echo "$DIR doesn't exist, Creating it now..."
            mkdir $DIR > /dev/null 2>&1
            if [ $? -ne 0 ]; then
                echo "Cannot create directory $DIR"
                exit 1
            fi
        fi
    done
    
  • 注意:is_directory返回0表示真,返回1表示假

波及和布尔运算符

awk定义了一组关系运算符用于awk情势相配。如下表

运算符 意义
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于
~ 匹配正则表达式
!~ 不匹配正则表达式

用/etc/passwd文件做个例子

# 第1域匹配root
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} $1~/root/' /etc/passwd
# 全部域匹配root
root:x:0:0:root:/root:/bin/bash
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} $0~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 全部域不匹配nologin
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} $0!~/nologin/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:4:65534:sync:/bin:/bin/sync
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
lightdm:x:108:114:Light Display Manager:/var/lib/lightdm:/bin

awk条件语句与C类似,有if语句,if/else语句以及if/else else语句二种。

下边是支撑的布尔运算符

运算符 意义
|| 逻辑或
&& 逻辑与
! 逻辑非
# 多条件精确匹配
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} {if($3==10||$4==10) print $0}' /etc/passwd
# 多条件模糊匹配
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
wsx@wsx-ubuntu:~/桌面$ awk 'BEGIN {FS=":"} {if($3~10||$4~10) print $0}' /etc/passwd
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
_apt:x:105:65534::/nonexistent:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
uuidd:x:107:111::/run/uuidd:/bin/false
lightdm:x:108:114:Light Display Manager:/var/lib/lightdm:/bin/false
whoopsie:x:109:116::/nonexistent:/bin/false
avahi-autoipd:x:110:119:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
wsx:x:1000:1000:wsx,,,:/home/wsx:/bin/bash
nx:x:123:1001::/var/NX/nx:/etc/NX/nxserver

AWK编制程序模型

awk程序由一个主输入循环维持,主输入循环自动依次读取文件行,用技术员定义的管理文件行的动作管理,循环推行直到终止条件。
与C,C ,Java的不如是,程序员不供给关心展开文件,读取文件行,关闭文件的动作,而只关注管理行的实施动作。

澳门新浦京娱乐场网站 1

正则表明式

  • 开头大家用grep在三个文本中搜索含有某个字符串的行,比方在头文件中搜索叁个宏定义。其实grep还是能搜索适合有个别方式(Pattern)的一类字符串。举例搜索富有符合xxx@xxx.xxx情势的字符串(也便是email地址),需要x字符可以是字母、数字、下划线、小数点或减号,email地址的每一局部能够有二个或两个x字符,譬如abc.d@ef.com、1_2@987-6.54,当然吻合那么些方式的不全部都以合法的email地址,但最少能够做一回始发筛选,筛掉a.b、c@d等自然不是email地址的字符串。再比方说,搜索装有符合yyy-yyy-yyy-yyy形式的字符串(也正是IP地址),供给y是0-9的数字,IP地址的每一某个能够有1-3个y字符。
  • 举个例子用grep查找叁个格局,怎么样表示这么些方式,这一类字符串,而不是特定的字符串呢?从那五个简单的例子能够看来,要代表二个格局至少应该蕴涵以下音信:
  • 字符类(Character Class):如上例的x和y,它们在械中意味着多个字符,可是取值范围是一类字符中的任意三个。
  • 多少限定符(Quantifier):邮件地址的每贰个片段能够有三个或多个x字符,IP地址的每一部分能够有1-3个y字符。
  • 各样字符类以及普通字符之间的岗位关系:比方邮件地址分三有的,用一般字符@和.隔绝,IP地址分四局部,用.隔离,每一局地都足以字符类和数据限制符描述。为了表示地点关系,还也有地方限定符(Anchor)的定义,就要底下介绍。
  • 分明部分格外语法表示字符类、数量限定符和职位关系,然后用这几个相当语法和一般字符一同表示一个格局,那就是正则表明式(Regular Expression)。比如email地址的正则表明式能够写成[a-zA-Z0-9.-] @[a-zA-Z0-9.-] .[a-zA-Z0-9_.-] ,IP地址的正则表明式能够写成[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}。下一节介绍正则表明式的语法,大家先看看正则表明式在grep中怎么用。举例有这么贰个文本testfile:

      192.168.1.1
      1234.234.04.5678
      123.4234.045.678
      abcde
    
      $ egrep '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' testfile
      192.168.1.1
      1234.234.04.5678
    
  • egrep也正是grep -E,表示采纳Extended正则表达式语法。grep的正则表明式有Basic和Extended两种典型,它们中间的区分下一节再解释。此外还或者有fgrep命令,相当于grep -F,表示只搜索一定字符而不找出正则说明式方式,不会按正则表明式的语法解释后边的参数。

  • 注意正则表明式参数用单引号括起来了,因为正则表明式中用到的洋洋特殊字符在Shell中也许有优异意义(譬如),唯有用单引号括起来技能确认保证这几个字符维持原状地传给grep命令,而不会被Shell解释掉。
  • 192.168.1.1契合上述方式,由多个.隔绝的四段组成,每段都是1到3个数字,所以这一行被搜索来了,可为啥1234.234.04.5678也被找寻来了呢?因为grep找的是带有某一形式的行,这一行蕴含多个适合格局的字符串234.234.04.567。相反,123.4234.045.678这一行不包罗符合形式的字符串,所以不会被搜索来。
  • grep是一种检索过滤工具,正则表明式在grep中用来查找符合情势的字符串。其实正则表明还应该有三个根本的运用是认证用户输入是不是合法,比方用户通过网页表单提交自个儿的email地址,就需求用程序验证一下是还是不是合法的email地址,这几个专业得以在网页的javascript中做,也得以在网站后台程序中做,举个例子PHP、Perl、Python、Ruby、Java或C,全部那些语言都帮忙正则表明式,能够说,如今不协助正则表明式的编制程序语言实在少见。除了编制程序语言之外,好多UNIX命令和工具也都支持正则表明式,比如grep、vi、sed、awk、emacs等等。“正则表明式”就好像“变量”同样,它是一个分布的定义,而不是某一种工具或编制程序语言的表征。

Shell脚本调节和测试方法

  • Shell提供了一部分用来调节和测试脚本的选项,如:

    -n      读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。
    -v      一边执行脚本, 一边将执行过的脚本命令打印到标准错误输出。
    -x      提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。
    
  • 那个接纳有三种常见的采取办法:

  • 1、在命令行提供参数。如:

    $ sh -x ./script.sh
    
  • 2、在本子开关提供参数。如:

    #! /bin/sh -x
    
  • 3、在剧本中用set命令运转或剥夺参数。如:

    #! /bin/sh
    
    if [ -z "$1" ]; then
        set -x
        echo "ERROR: Insufficient Args."
        exit 1
        set  x
    fi
    
  • set -x和set x分别代表启用或剥夺-x参数,那样能够只对剧本中的某一段进展追踪调节和测试。

表达式

三个awk表明式能够由数值、字符常量、变量、操作符、函数和正则表明式自由组合而成。

运算符 意义
-
*
/
%
^或** 乘方
x 在返回x之前,x变量加1
x 在返回x之后,x变量加1
wsx@wsx-ubuntu:~/桌面$ awk '/^$/{print x =1}' input
1
2
3
4
5

AWK调用

Shell中调用
awk [-F 域分隔符] ‘awk程序段’ 输入文件 将awk程序段插入脚本文件
awk -f awk脚本文件 输入文件 将脚本文件设置为可推行
./awk脚本文件 输入文件

中心语法

  • 大家知道C的变量和Shell脚本变量的定义和动用方法很不平等,表达技术也不均等,C的变量有各类别型,而Shell脚本变量都是字符串。一样道理,种种工具和编制程序语言研商所选取的正则表明式规范的语法并分裂样,表明技巧也各差异,有的正则表明式标准引进许多扩张,能发布更头眼昏花的形式,但种种正则表明式规范的基本概念都以想通的。本节介绍egrep(1)所采取的正则表明式,它大概上符合POSIX正则表明式规范,详见regex(7)(看这几个man page对你的英文相对是很好的锻炼)。希望读者仿照上一节的例子,一边学习语法,一边用egrep命令做尝试。
  • 字符类
    • .相配任意三个字符,abc.可以相称abcd、abc9等。
    • []匹配括号中的任性二个字符,[abc]d能够相称ad、bd或cd。
    • -在[]括号内代表字符范围,[0-9a-fA-F]能够同盟壹个人十六进制数字。
    • ^位于[]括号内的起来,相称括号中的字符之外的专断三个字符,[^xy]相称xy之外的任一字符,因而[^xy]1能够相称a1、b1但不相配x1、y1。
    • [[:xxx:]]grep工具预约义的有些命名字符类,[[:alpha:]]协作贰个假名,[[:digit:]]相称贰个数字。
  • 多少限定符

    • ?紧跟在它后边的单元相称零次或一回,[0-9]?.[0-9]相配0.0、2.3、.5等,由于.在正则表达式中是贰个特殊字符,所以要求用转义一下,取字面值。
    • 紧跟在它前边的单元应卓越贰次或频仍,[a-zA-Z0-9_.-] @[a-zA-Z0-9_.-] .[a-zA-Z0-9_.-] 匹配email地址。
    • *紧跟在它前边的单元应同盟零次或频仍,[0-9][0-9]*非常至少一个数字,等价于[0-9] [a-zA-Z_] [a-zA-Z_0-9]*相称C语言的标志符。
    • {N}紧跟在它眼前的单元应标准相配N次,[1-9][0-9]{2}匹配从100到999的整数。
    • {N,}紧跟在它前面的单元应非常至少N次,[1-9][0-9]{2,}相配四个人以上(含三位)的大背头。
    • {,M}紧跟在它日前的单元应出色最多M次,[0-9]{,1}相当于[0-9]?
    • {N,M}紧跟在它后面的单元应合营至少次,最多M次,[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}匹配IP地址。
    • 重新注意:grep找的是富含某一格局的行,而不是一点一滴匹配某一形式的行
    • 举例有如下文本:

        aaabc
        aad
        efg
      
    • 查找a*这几个形式的结果,会意识,三行都被找了出去。

        $ egrep 'a*' testfile
        aaabc
        aad
        efg
      
    • a相称0个或多少个a,而第三行包罗0个a,所以也包涵了这一形式。单独用a那样的正则表达式做查找没什么意思,一般是把a*用作正则表达式的一局地来用。

  • 职分限定符

    • ^极度行首的地点,^Content合作位于一行开端的Content。
    • $相称行末的地点,;$优良位于一行结尾的;号,^$相配空行。
    • <合营单词开关的岗位,<th相称... this,但不相配ethernet、tenth。
    • >特别单词结尾的岗位,p>相配leap ...,但不相称parent、sleepy。
    • b协作单词按钮或最后的岗位,batb相配... at ...,但不相称cat、atexit、batch。
    • B非凡非单词开头和最后的任务,BatB相称battery,但不相称... attend、hat ...
    • 职责限定符能够扶助grep更标准地寻觅。
    • 比如说上一节我们用[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}探索IP地址,找到这两行

        192.168.1.1
        1234.234.04.5678
      
    • 如果用^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$追寻,就足以1234.234.04.5678这一行过滤掉了。

  • 别的特殊字符

    • 转义字符,普通字符转义为特殊字符,特殊字符转义为一般字符。普通字符<写成<表示单词初步的岗位,特殊字符.写成.以及写成就当做普通字符来配合。
    • ()将正则表明式的一部分括起来组成八个单元,能够对全部单元使用数据限定符。([0-9]{1,3}.){3}[0-9]{1,3}匹配IP地址
    • |接连多少个子表明式,表示或的涉嫌。n(o|either)匹配no或neither

正则表达式

  • 先前我们用grep在三个文件中搜索含有某个字符串的行,举个例子在头文件中搜索多个宏定义。其实grep还是能够寻找适合有些模式(Pattern)的一类字符串。举例寻找全体符合[email protected]形式的字符串(约等于email地址),须求x字符可以是字母、数字、下划线、小数点或减号,email地址的每一有的能够有三个或八个x字符,举例[email protected]、[email protected],当然吻合那一个方式的不全都以合法的email地址,但至少能够做二回开头筛选,筛掉a.b、[email protected]等自然不是email地址的字符串。再比方,寻找具有符合yyy-yyy-yyy-yyy情势的字符串(也正是IP地址),必要y是0-9的数字,IP地址的每一片段能够有1-3个y字符。
  • 若是用grep查找八个方式,怎样表示这么些情势,这一类字符串,而不是一定的字符串呢?从那五个轻松的事例能够见见,要代表二个情势至少应当包含以下音讯:
  • 字符类(Character Class):如上例的x和y,它们在械中象征三个字符,不过取值范围是一类字符中的肆意三个。
  • 数量限定符(Quantifier):邮件地址的每一个有的能够有一个或三个x字符,IP地址的每一局地能够有1-3个y字符。
  • 种种字符类以及常见字符之间的任务关系:比方邮件地址分三片段,用普通字符@和.隔离,IP地址分四部分,用.隔离,每一有个别都足以字符类和数目限制符描述。为了表示地点关系,还会有位置限定符(Anchor)的定义,就要上面介绍。
  • 规定部分例外语法表示字符类、数量限定符和地点关系,然后用这几个新鲜语法和一般性字符一同表示一个形式,那正是正则表明式(Regular Expression)。比方email地址的正则表明式可以写成[a-zA-Z0-9.-][email protected][a-zA-Z0-9.-] .[a-zA-Z0-9_.-] ,IP地址的正则表达式能够写成[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}。下一节介绍正则表明式的语法,大家先看看正则表明式在grep中怎么用。举个例子有诸如此类贰个文书testfile:

    192.168.1.1
    1234.234.04.5678
    123.4234.045.678
    abcde
    
    $ egrep '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' testfile
    192.168.1.1
    1234.234.04.5678
    
  • egrep也正是grep -E,表示选取Extended正则表明式语法。grep的正则表明式有Basic和Extended三种标准,它们之间的分别下一节再解释。其余还应该有fgrep命令,相当于grep -F,表示只寻觅一定字符而不寻找正则表明式格局,不会按正则表达式的语法解释前边的参数。

  • 专注正则表明式参数用单引号括起来了,因为正则表明式中用到的广大特殊字符在Shell中也可能有极度含义(举个例子),只有用单引号括起来本领有限帮衬那个字符原封不动地传给grep命令,而不会被Shell解释掉。

  • 192.168.1.1契合上述形式,由七个.隔绝的四段组成,每段都以1到3个数字,所以这一行被搜索来了,可为什么1234.234.04.5678也被寻找来了啊?因为grep找的是富含某一方式的行,这一行包涵二个适合格局的字符串234.234.04.567。相反,123.4234.045.678这一行不含有符合情势的字符串,所以不会被寻觅来。
  • grep是一种检索过滤工具,正则表明式在grep中用来找出符合情势的字符串。其实正则表达还应该有四个第一的接纳是印证用户输入是或不是合法,举例用户通过网页表单提交本人的email地址,就须要用程序验证一下是还是不是合法的email地址,那么些工作能够在网页的javascript中做,也得以在网址后台程序中做,比方PHP、Perl、Python、Ruby、Java或C,全体那个语言都帮忙正则表明式,能够说,近年来不帮衬正则表明式的编程语言实在少见。除了编制程序语言之外,繁多UNIX命令和工具也都帮衬正则表明式,举例grep、vi、sed、awk、emacs等等。“正则表达式”就如“变量”一样,它是三个大规模的定义,而不是某一种工具或编程语言的特点。

系统变量

awk定义了成都百货上千内建变量用于安装蒙受新闻,大家誉为系统变量。分为三种:一种用于转移awk的暗许值,比如域分隔符;第三种用于定义系统值,在处理公事时能够读取那么些系统值。

变量名 意义
$n 当前记录的第n个域,域用FS分隔
$0 记录的所有域
ARGC 命令行参数的数量
ARGIND 命令行中当前文件的位置(从0开始标号)
ARGV 命令行参数的数组
CONVFMT 数字转换格式
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FIELDWIDTHS 字段宽度列表,以空格键分隔
FILENAME 当前文件名
FNR 浏览文件的记录数
FS 字段分隔符,默认是空格键
IGNORECASE 布尔变量,如果为真,则进行忽略大小写的匹配
NF 当前记录中的域数量
NR 当前记录数
OFMT 数字的输出格式
OFS 输出域分隔符,默认是空格键
ORS 输出记录分隔符,默认是换行符
RLENGTH 由match函数所匹配的字符串长度
RS 记录分隔符,默认是空格键
RSTART 由match函数所匹配的字符串的第1个位置
SUBSEP 数组下标分隔符,默认值是34

AWK编程

Basic正则和Extended正则不一致

  • 以上介绍的是grep正则表明式的Extended标准,Basic标准也可以有这么些语法,只是字符? {}|()应表达为普通字符,要表示上述特殊意义则供给加转义。假如用grep而不是egrep,并且不加-E参数,则应依照Basic标准来写正则表达式。

主导语法

  • 小编们知道C的变量和Shell脚本变量的概念和接纳方法很不同,表明才具也不等同,C的变量有各种类型,而Shell脚本变量都以字符串。一样道理,各类工具和编制程序语言斟酌所运用的正则表达式标准的语法并差别,表明本领也各差别样,有的正则表明式标准引进好多恢宏,能公布更复杂的格局,但各个正则表明式规范的基本概念皆以想通的。本节介绍egrep(1)所利用的正则表明式,它大约上符合POSIX正则表明式标准,详见regex(7)(看那么些man page对您的英文相对是很好的锻练)。希望读者仿照上一节的例子,一边念书语法,一边用egrep命令做尝试。
  • 字符类
    • .相称任意四个字符,abc.能够相称abcd、abc9等。
    • []相配括号中的任性一个字符,[abc]d能够相称ad、bd或cd。
    • -在[]括号内表示字符范围,[0-9a-fA-F]能够协作一位十六进制数字。
    • ^位于[]括号内的伊始,相称括号中的字符之外的人身自由多个字符,[^xy]相配xy之外的任一字符,因而[^xy]1能够相配a1、b1但不相称x1、y1。
    • [[:xxx:]]grep工具预订义的一些命名字符类,[[:alpha:]]合作三个假名,[[:digit:]]相称二个数字。
  • 数量限定符

    • ?紧跟在它前面包车型客车单元相配零次或二遍,[0-9]?.[0-9]协作0.0、2.3、.5等,由于.在正则表达式中是二个特殊字符,所以须要用转义一下,取字面值。
    • 紧跟在它眼前的单元应至极一遍或频仍,[a-zA-Z0-9_.-][email protected][a-zA-Z0-9_.-] .[a-zA-Z0-9_.-] 匹配email地址。
    • *紧跟在它后面包车型地铁单元应协作零次或频仍,[0-9][0-9]*相配至少二个数字,等价于[0-9] [a-zA-Z_] [a-zA-Z_0-9]*相称C语言的标识符。
    • {N}紧跟在它后边的单元应规范相称N次,[1-9][0-9]{2}匹配从100到999的整数。
    • {N,}紧跟在它前面的单元应特别至少N次,[1-9][0-9]{2,}合营叁个人以上(含肆位)的大背头。
    • {,M}紧跟在它跟前的单元应优秀最多M次,[0-9]{,1}相当于[0-9]?
    • {N,M}紧跟在它前面包车型的士单元应协作至少次,最多M次,[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}匹配IP地址。
    • 再一次注意:grep找的是带有某一形式的行,而不是一心相配某一情势的行
    • 举个例子有如下文本:

      aaabc
      aad
      efg
      
    • 查找a*以此格局的结果,会发觉,三行都被找了出去。

      $ egrep 'a*' testfile
      aaabc
      aad
      efg
      
    • a相配0个或多个a,而第三行李包裹括0个a,所以也暗含了这一情势。单独用a那样的正则表明式做查找没什么意思,一般是把a*用作正则表达式的一局部来用。

  • 岗位限定符

    • ^相称行首的职务,^Content卓殊位于一行开始的Content。
    • $协作行末的职责,;$相称位于一行结尾的;号,^$相称空行。
    • <匹配单词开关的职位,<th相配... this,但不相称ethernet、tenth。
    • >合营单词结尾的职位,p>相配leap ...,但不相称parent、sleepy。
    • b杰出单词开关或最后的地方,batb匹配... at ...,但不相配cat、atexit、batch。
    • B合作非单词开端和尾声的岗位,BatB相配battery,但不匹配... attend、hat ...
    • 岗位限定符能够协助grep校勘确地查找。
    • 诸如上一节大家用[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}寻觅IP地址,找到这两行

      192.168.1.1
      1234.234.04.5678
      
    • 如果用^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$追寻,就能够1234.234.04.5678这一行过滤掉了。

  • 其它特殊字符

    • 转义字符,普通字符转义为特殊字符,特殊字符转义为常见字符。普通字符<写成<表示单词起首的岗位,特殊字符.写成.以及写成就当做普通字符来同盟。
    • ()将正则表明式的一部分括起来组成一个单元,能够对全体单元使用数据限定符。([0-9]{1,3}.){3}[0-9]{1,3}匹配IP地址
    • |连接多少个子表明式,表示或的涉嫌。n(o|either)匹配no或neither

格式化输出

awk借鉴C语言的语法,定义了printf输出语句。基本语法如下:

printf(格式控制符, 参数)

格式调整符分为修饰符和格式符二种,如下:

修饰符 意义
- 左对齐
width 域的步长
.prec 小数点右边的位数
运算符 意义
%c ASCII字符
%d 整型数
%e 浮点数,科学计数法
%f 浮点数
%o 八进制数
%s 字符串
%x 十六进制数

AWK形式相配

awk由情势和动作结合。情势是一组用于测试输入行是或不是需求推行语句,动作则是含有语句,函数和表明式的施行进程。即情势决定动作曾几何时触发事件,动作推行对输入行管理
如:awk ‘/^$/{print “this is a blank line.”}’ input

grep

  • 1、作用
    • Linux系统中grep命令是一种庞大的文本搜索工具,它能选拔正则表明式找出文件,并把相配的行打字与印刷出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的应用权限是全数用户。
    • grep家族包涵grep、egrep和fgrep。egrep和fgrep的命令只跟grep有非常的小分裂。egrep是grep的扩展,协助越来越多的re元字符,fgrep便是fixed grep和fast grep,它们把具有的假名都用作单词,也便是说,正则表明式中的元字符表示回其自个儿的字面意义,不再新鲜。linux使用GNU版本的grep。它效益越来越强,能够透过-G、-E、-F命令选项来接纳egrep和fgerp的机能。
  • 2、格式及首要参数
    • grep [option]
    • 首要参数:grep -help可查阅
      • -c:只输出相称行的计数。
      • -i:不区分轻重缓急写。
      • -h:查询多文件时不突显文件名。
      • -l:查询多文本时只输出蕴涵匹配字符的文书名。
      • -n:展现匹配行及行号。
      • -s:不展现不存在或无相配文本的错误音讯。
      • -v:彰显不带有相称文本的有着行。
      • --color=auto:能够将找到的根本词部分加上颜色的展现。
    • pattern正则表达式首要参数:
      • :忽略正则表明式中特殊字符的原来含义。
      • ^:相配正则表明式的开头行
      • $:相配正则表明式的终结行
      • <:从相配正则表明式的行早先
      • >:到卓越正则表达式的行终止
      • []:单个字符,如[A]即A符合须要
      • [ - ]:范围,如[A-Z],即A、B、C一贯到Z都符合须要。
      • .:全体的单个字符。
      • *:全数字符,长度可以为0。
  • 3、grep命令使用简易实例

      $ grep 'test' d*            显示所有以d开头的文件中包含test的行。
    

Basic正则和Extended正则差别

  • 以上介绍的是grep正则表明式的Extended标准,Basic标准也会有这么些语法,只是字符? {}|()应表明为普通字符,要表示上述特殊含义则供给加转义。假设用grep而不是egrep,并且不加-E参数,则应依照Basic标准来写正则表达式。

置于字符串函数

awk提供了强有力的放权字符串函数,用于落到实处文件的字符串替换、查找以及分隔等成效,下表列出:

函数名 意义
gsub(r,s) 在输入文件中用s替换r
gsub(r,s,t) 在t中用s替换r
index(s,t) 返回s中字符串第一个t的位置
length(s) 返回s的长度
match(s,t) 测试s是否包含匹配t的字符串
split(r,s,t) 在t上将r分为序列s
sub(r,s,t) 将t中第1次出现的r替换为s
substr(r,s) 返回字符串r中从s开始的后缀部分
substr(r,s,t) 返回字符串r中从s开始长度为t的后缀部分

笔录和域

awk以为文件是有结构的,每一作为二个笔录,记录由域组成,域之间利用空格,Tab或任何标识举行分隔。
域操作符$:内定试行动作的域,$1…标记每一个域,$0代表全数记录;也得以跟变量或变量表明式
如:awk ‘BEGIN{one=1;two=2} {print $(one two)}’ input
暗许是空格,Tab键被认为是多个空格(也四个空格被当成二个空格)
1.得以动用-F 来改造暗中认可的相间符
2.能够使用情形变量FS设置分隔符
实例:
1.FS=”t”
2.FS=”t ”
记录:wazttcq
对于FS=”t” 分成五个域,waz,空域,cq;对于FS=”t ”,结果是waz,cq

find

  • 是因为find具备庞大的效能,所以它的选项也大多,当中山高校部分精选都值得大家花时间来询问一下。即便系统中蕴藏网络文件系统(NFS),find命令在该文件系统中一律有效,只要你持有相应的权杖。
  • 在运营二个足够消功耗源的find命令时,很三人都倾向于把它身处后台实践,因为遍历四个大的文件系统恐怕会费用不长的时刻(这里是指30G字节以上的文件系统)。
  • 一、find命令格式

    • 1、find命令的貌似方式为

      find pathname -options [-print -exec -ok ...]

    • 2、find命令的参数

      • pathname:find命令所查找的目录路径。比方用.来代表当前目录,用/来代表系统根目录,递归查找。
      • -print:find命令将至极的公文输出到专门的职业输出。
      • -exec:find命令对郎才女貌的公文实施该参数所付出的shell命令。相应命令的花样为'command' {} ;,注意{}内部无空格,和;之间含有四个空格分隔符。
      • -ok:和-exec的功效同样,只但是以一种尤其安全的形式来试行该参数所付出的shell命令,在实施每叁个下令在此以前,都会提交提示,让用户来分明是或不是实行。
    • 3、find命令选项
      • -name:依据文件名查找文件。
      • -perm:依据文件权限来查找文件。
      • -prune:使用这一选项能够使find命令不在当前点名的目录中寻找,若是同一时候利用-depth选项,那么-prune将被find命令忽略。
      • -user:依照文件属主来查找文件。
      • -group:依照文件所属的组来查找文件。
      • -mtime -n n:根据文件的改观时间来查找文件,-n表示文件退换时间距现在n天之内, n代表文件改变时间距离以后n天在此以前。find命令还应该有-atime和-ctime选项,但它们都有-mtime选项。
      • -nogroup:查找无有效属组的文书,即该公文所属的组在/etc/groups中不存在。
      • -nouser:查找无有效属主的文书,即该公文的属主在/etc/passwd中不存在。
      • newer file1 ! file2:查找改造时间比文件file1新但比文件file2旧的文书。
      • -type:查找某一类其余文件,诸如:
        • b:块设备文件
        • d:目录
        • c:字符设备文件
        • p:管道文件
        • l:符号链接文件
        • f:普通文书
      • -size n:[c]查找文件长度为n块的公文,带有c时表示文件长度以字节计。
      • -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中搜寻。
      • fstype:查找位于某一类型文件系统中的文件,这个文件系统类型一般能够在配备文件/etc/fstab中找到,该配置文件中隐含了本系统中有关文件系统的新闻。
      • mount 在查找文件时不超越文件系统mount点。
      • follow 如若find命令蒙受符号链接文件,就追踪至链接所针对的文件。
    • 除此以外,下边五个的界别:
      • -amin n 查找系统中最终n分钟访问的文书
      • -atime n 查找系统中最终n*24钟头访问的文书
      • -cmin n 查找系统中最终n分钟被更改文件状态的文书
      • -ctime n 查找系统中最后n*24钟头被退换文件状态的文书
      • -mmin n 查找系统中最后n分钟被改成文件数量的文件
      • -mtime n 查找系统中最终n*24时辰被转移文件数量的文书
    • 4、使用exec或ok来执行shell命令

      • 接纳find时,只要把想要的操作写在一个文书里,就足以用exec来合作find查找,很有益于的。
      • 在有一点操作系统中只允许-exec选项诸如ls或ls -l那样的通令。大多数用户采用这一选项是为了搜索旧文件并删除它们。建议在真正实践rm命令删除文件以前,最佳先用ls命令看一下,确认它们是具备删除文件。
      • exec选项前边跟随着所要施行的吩咐或脚本,然后是一对儿{},多个空格和二个,最后是一个分集团。为了使用exec选项,必需要同一时候选取print选项。倘若证实一下find命令,会意识该命令只输出从方今路径起的相对路线及文件名。
      • 比如说:为了用ls -l命令列出所相称的文书,能够把ls -l命令放在find命令的-exec选项中

          $ find . -type f -exec ls -l {} ;
        
      • 上面的事例中,find命令相配到了当前目录下的有着普通文书,并在-exec选项中动用ls -l命令将它们列出。

      • 在/logs目录中检索改变时间在5日在此在此以前的文本并删除它们:

          $ find logs -type f -mtime  5 -exec rm {} ;
        
      • 记住:在shell中用任何措施删除文件在此之前,应超过查占卜应的文件,一定要小心!当使用诸如mv或rm命令时,能够利用-exec选项的平安方式。它将要对各种相配到的公文操作在此以前提醒您。

      • 在底下的事例中,find命令在当前目录中寻找全数文件名以.LOG结尾、更动时间在5日上述的文书,并剔除它们,只但是在剔除在此之前先交付提醒。

          $ find . -name "*.conf" -mtime  5 -ok rm {} ;
          < rm ... ./conf/httpd.conf > ? n
        
      • 按y键删除文件,按n键不删除。

      • 其余款式的通令都能够在-exec选项中使用。
      • 在底下的事例中大家选择grep命令。find命令首先相称全部文件名称为"passwd*"的公文,比方passwd、passwd.old、passed.bak,然后实践grep命令看看在这几个文件中是还是不是留存叁个itcast用户。

          $ find /etc -name "passwd*" -exec grep "root" {} ; 
          root:x:0:0:root:/root:/bin/zsh
        
  • 二、find使用例子

      find ./ -name *.mp3
    
      find ./ -type f/d/p/c/b/s/l
    
      find ./ -size  3M -size -7M             默认单位:512B  0.5k  一个扇区大小 
    
      find ./ -size  47k -size -89k
    
      find ./ -maxdepth 2 -type d
    
      find ./ -maxdepth 1 -name "*.sh" -exec rm -r {} ;
    
      find ./ -maxdepth 1 -name "*.sh" -ok rm -r {} ;
    
      find ./ -maxdepth 1 -type f -print0 | xargs -0 ls -lh
    
      find ./ -name "*.gz" -mtime -5 -exec ls -lh {} /;
    

grep

  • 1、作用
    • Linux系统中grep命令是一种庞大的公文找出工具,它能动用正则表达式寻找文件,并把相配的行打字与印刷出来。grep全称是Global Regular Expression Print,表示全局正则表明式版本,它的利用权力是具备用户。
    • grep家族包含grep、egrep和fgrep。egrep和fgrep的命令只跟grep有比非常小差异。egrep是grep的扩大,协助越多的re元字符,fgrep正是fixed grep和fast grep,它们把富有的字母都当做单词,约等于说,正则表明式中的元字符表示回其自己的字面意义,不再新鲜。linux使用GNU版本的grep。它效益更加强,能够因而-G、-E、-F命令选项来使用egrep和fgerp的效率。
  • 2、格式及首要参数
    • grep [option]
    • 重要参数:grep -help可查看
      • -c:只输出相配行的计数。
      • -i:不区分轻重缓急写。
      • -h:查询多文本时不展现文件名。
      • -l:查询多文件时只输出蕴含相称字符的公文名。
      • -n:呈现相称行及行号。
      • -s:不显示不设有或无相称文本的错误消息。
      • -v:呈现不含有相配文本的具有行。
      • --color=auto:能够将找到的重大词部分加上颜色的显得。
    • pattern正则表明式首要参数:
      • :忽略正则表明式中特殊字符的原本含义。
      • ^:相配正则表达式的上马行
      • $:相配正则表达式的甘休行
      • <:从相称正则表明式的行初叶
      • >:到卓殊正则表达式的行终止
      • []:单个字符,如[A]即A符合要求
      • [ - ]:范围,如[A-Z],即A、B、C一向到Z都符合须要。
      • .:全部的单个字符。
      • *:全部字符,长度可认为0。
  • 3、grep命令使用简易实例

    $ grep 'test' d*            显示所有以d开头的文件中包含test的行。
    

向awk脚本传递参数

awk脚本内的变量能够在指令行中举办赋值,完毕向awk脚本传递参数,变量赋值放在脚本之后、输入文件在此之前,格式为:

awk脚本 parameter=value 输入文件

波及和布尔运算符

运算符 意义
<  
>  
~ 匹配正则表达式
!~ 不匹配正则表达式
ll  
&&  
!  

sed

  • sed意为流编辑器(Stream 艾德itor),在Shell脚本和Makefile中作为过滤器使用非常平时,也正是把前面叁个顺序的输出引进sed的输入,经过一密密麻麻编写制定命令转变为另一种格式输出。sed和vi都来源于开始的一段时代UNIX的ed工具,所以众多sed命令和vi的末行命令是一致的。
  • sed命令行的基本格式为:

      sed option 'script' file1 file2 ...
      sed option -f scriptfile file1 file2 ...
    
  • 慎选含义:

        -n, --quiet, --silent
                       静默输出,默认情况下,sed程序在所有脚本指令执行完毕后,
                       将自动打印模式空间中的内容,这些选项可以屏蔽自动打印。
    
        -e 脚本, --expression=脚本
                       允许多个脚本指令被执行。
    
        -f 脚本文件, --file=脚本文件
                       从文件中读取脚本指令,对编写自动脚本程序来说很棒!
    
        --follow-symlinks
                       直接修改文件时跟随软链接
    
        -i[SUFFIX], --in-place[=SUFFIX]
                       直接修改源文件,经过脚本指令处理后的内容将被输出至源文件
                      (源文件被修改)慎用!
    
        -l N, --line-length=N
                       该选项指定l指令可能输出的行长度,l指令用于输出非打印字符。
    
        --posix
                       禁用GNU sed扩展功能。
    
        -r, --regexp-extended
                       在脚本指令中使用扩展正则表达式
    
        -s, --separate
                       默认情况下,sed将把命令行指定的多个文件名作为一个长的连续的输入流。
                       而GNU sed则允许把他们当作单独的文件,这样如正则表达式则不进行跨文件匹配。
    
        -u, --unbuffered
                       从输入文件读取最少的数据,更频繁的刷新输出
    
        -z, --null-data
                       separate lines by NUL characters
            --help     显示帮助文档
            --version  显示sed版本。
    
        - 如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为
          sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准
          输入读取数据。
    
  • 上述仅是sed程序本人的选项意义表达,至于具体的本子指令(即对文本内容做的操作)前面我们会详细描述,这里大约介绍多少个本子指令操作作为sed程序的事例。

      a,  append          追加
      i,  insert          插入
      d,  delete          删除
      s,  substitution    替换
    
  • 如:$ sed "2a test" ./testfile在输出testfile内容的第二行后加多"test"。

      $ sed "2,5d" testfile
    
  • sed管理的文书不仅可以由职业输入重定向获得,也足以当命令行参数字传送入,命令行参数能够贰遍传入多个文本,sed会依次拍卖。sed的编写制定命令能够一向当命令行参数字传送入,也足以写成一个剧本文件然后用-f参数钦命,编辑命令的格式为:

      /pattern/action
    
  • 其间pattern是正则表达式,action是编辑操作。sed程序一行一行读出待管理公事,假使某一行与pattern相配,则推行相应的action,若是一条命令未有pattern而只有action,那几个action将成效于待管理文件的每一行。

  • 常用sed命令

      /pattern/p  打印匹配pattern的行
      /pattern/d  删除匹配pattern的行
      /pattern/s//pattern1/pattern2/  查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2   
      /pattern/s//pattern1/pattern2/g  查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2
    
    • 应用p命令必要小心,sed是把待管理文件的内容及其管理结果一齐输出到正规输出的,由此p命令表示除了把公文内容打字与印刷之外还非常打字与印刷一次相称pattern的行。比方一个文本testfile的从头到尾的经过是

        123
        abc
        456
      
    • 打字与印刷当中包蕴abc的行

        $ sed '/abc/p' testfile
        123
        abc
        abc
        456
      
    • 要想只输出管理结果,应丰裕-n选项,这种用法约等于grep命令

        $ sed -n '/abc/p' testfile
        abc
      
    • 使用d命令就不必要-n参数了,譬如删除含有abc的行

        $ sed 'abc/d' testfile
        123
        456
      
    • 专注,sed命令不会修改原著件,删除命令只代表有些行不打字与印刷输出,而不是从原作件中删除。

    • 动用查找替换命令时,能够把相配pattern1的字符串复制到pattern2中,比方:

        $ sed 's/bc/-&-/' testfile
        123
        a-bc-
        456
      
    • 再比如:

        $ sed 's/([0-9])([0-9])/-1-~2~/' testfile
        -1-~2~3
        abc
        -4-~5~6
      
    • pattern2中的1意味与pattern1的首先个()括号相匹配的剧情,2象征与pattern1的第贰个()括号相相配的剧情。sed默许使用Basic正则表明式标准,就算钦定了-r选项则使用Extended规范,那么()括号就无须转义了。如:

        $ sed -r 's/([0-9])([0-9])/-1-~2~/' testfile
      
    • 轮换结束后,全体行,含有三番五次数字的第叁个数字前后都增多了"-"号;第贰个数字前后都加多了“~”号。

    • 能够一遍钦定多条差别的轮换命令,用“;”隔离:

        $ sed 's/yes/no/; s/static/dhcp/' testfile
        注:使用分号隔开指令。
      
    • 也得以采取-e参数来钦点差别的轮换命令,有多少个替换命令需增多几个-e参数:

        $ sed -e 's/yes/no/' -e 's/static/dhcp/' testfile
        注:使用-e选项
      
    • 一旦testfile的原委是

        <html><head><title>Hello World</title></head>
        <body>Welcome to the world of regexp!</body></html>
      
    • 最近要去掉全体的HTML标签,使输出结果为:

        Hello World
        Welcome to the world of regexp!
      
    • 如何做吗?若是用上面包车型大巴下令

        $ sed 's/<.*>//g' testfile
      
    • 结果是三个空行,把具备字符都过滤掉了。那是因为,正则表明式中的数量限制符会相配尽大概长的字符串,那称之为贪心的(Greedy)。举个例子sed在管理第一行时,<.*>相称的并不是或那样的标签,而是

        <html><head><title>Hello World</title></head>
      
    • 那样一整行,因为这一行起头是<,中间是多少个随机字符,末尾是>。那么那条命令怎么改才对吗?留给同学们想想。

find

  • 鉴于find具备庞大的功能,所以它的选项也诸多,当中大多抉择都值得大家花时间来打听一下。就算系统中隐含网络文件系统(NFS),find命令在该文件系统中一律有效,只要你有着相应的权力。
  • 在运作八个百般消耗电源的find命令时,很几个人都赞成于把它位于后台实行,因为遍历二个大的文件系统大概会花费非常短的年华(这里是指30G字节以上的文件系统)。
  • 一、find命令格式

    • 1、find命令的一般方式为

      find pathname -options [-print -exec -ok ...]

    • 2、find命令的参数

      • pathname:find命令所查找的目录路线。举例用.来代表当前目录,用/来代表系统根目录,递归查找。
      • -print:find命令将合营的文书输出到正式输出。
      • -exec:find命令对男才女貌的文件施行该参数所付出的shell命令。相应命令的样式为'command' {} ;,注意{}内部无空格,和;之间含有二个空格分隔符。
      • -ok:和-exec的作用同样,只然而以一种越发安全的情势来实行该参数所付出的shell命令,在奉行每五个命令在此之前,都会提交提示,让用户来鲜明是还是不是实施。
    • 3、find命令选项

      • -name:遵照文件名查找文件。
      • -perm:依据文件权限来查找文件。
      • -prune:使用这一选项能够使find命令不在当前点名的目录中找找,若是同一时间利用-depth选项,那么-prune将被find命令忽略。
      • -user:根据文件属主来查找文件。
      • -group:依据文件所属的组来查找文件。
      • -mtime -n n:依照文件的更换时间来查找文件,-n代表文件改造时间距以往n天之内, n代表文件改动时间距离将来n天在此在此之前。find命令还应该有-atime和-ctime选项,但它们都有-mtime选项。
      • -nogroup:查找无有效属组的文书,即该公文所属的组在/etc/groups中不存在。
      • -nouser:查找无有效属主的文书,即该公文的属主在/etc/passwd中不存在。
      • newer file1 ! file2:查找改换时间比文件file1新但比文件file2旧的文书。
      • -type:查找某一门类的文件,诸如:
        • b:块设备文件
        • d:目录
        • c:字符设备文件
        • p:管道文件
        • l:符号链接文件
        • f:普通文书
      • -size n:[c]查找文件长度为n块的公文,带有c时表示文件长度以字节计。
      • -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中寻找。
      • fstype:查找位于某一等级次序文件系统中的文件,那几个文件系统类型一般可以在布署文件/etc/fstab中找到,该配置文件中带有了本系统中有关文件系统的音信。
      • mount 在查找文件时不超过文件系统mount点。
      • follow 如若find命令蒙受符号链接文件,就跟踪至链接所针对的文件。
    • 其它,下边八个的界别:

      • -amin n 查找系统中最后n分钟访问的文书
      • -atime n 查找系统中最后n*24钟头访问的文书
      • -cmin n 查找系统中最后n分钟被改造文件状态的文件
      • -ctime n 查找系统中末了n*24时辰被退换文件状态的文书
      • -mmin n 查找系统中最后n分钟被改变文件数量的文件
      • -mtime n 查找系统中最后n*24小时被改成文件数量的文书
    • 4、使用exec或ok来执行shell命令

      • 接纳find时,只要把想要的操作写在八个文本里,就足以用exec来合作find查找,很方便的。
      • 在有个别操作系统中只允许-exec选项诸如ls或ls -l那样的吩咐。大多数用户选择这一选项是为着追寻旧文件并删除它们。提出在真的实践rm命令删除文件从前,最佳先用ls命令看一下,确认它们是具有删除文件。
      • exec选项前边跟随着所要试行的吩咐或脚本,然后是一对儿{},多个空格和三个,最终是二个分公司。为了使用exec选项,须要求同时使用print选项。如若证实一下find命令,会意识该命令只输出从近些日子路径起的相对路线及文件名。
      • 诸如:为了用ls -l命令列出所相称的文本,能够把ls -l命令放在find命令的-exec选项中

        $ find . -type f -exec ls -l {} ;
        
      • 下边包车型大巴例证中,find命令相配到了当前目录下的具备普通文书,并在-exec选项中运用ls -l命令将它们列出。

      • 在/logs目录中查找改造时间在5日在此以前的公文并删除它们:

        $ find logs -type f -mtime  5 -exec rm {} ;
        
      • 记住:在shell中用其他方法删除文件此前,应当先查占星应的文书,一定要小心!当使用诸如mv或rm命令时,能够选用-exec选项的安全情势。它就要对各种相称到的文件操作此前提醒您。

      • 在上边包车型客车事例中,find命令在当前目录中搜索全体文件名以.LOG结尾、更换时间在5日以上的文本,并剔除它们,只不过在剔除此前先交由提示。

        $ find . -name "*.conf" -mtime  5 -ok rm {} ;
        < rm ... ./conf/httpd.conf > ? n
        
      • 按y键删除文件,按n键不删除。

      • 别的款式的一声令下都足以在-exec选项中央银行使。
      • 在上边的例证中我们利用grep命令。find命令首先相配全数文件名称叫"passwd*"的文书,举例passwd、passwd.old、passed.bak,然后施行grep命令看看在这几个文件中是否存在三个itcast用户。

        $ find /etc -name "passwd*" -exec grep "root" {} ; 
        root:x:0:0:root:/root:/bin/zsh
        
  • 二、find使用例子

    find ./ -name *.mp3
    
    find ./ -type f/d/p/c/b/s/l
    
    find ./ -size  3M -size -7M             默认单位:512B  0.5k  一个扇区大小 
    
    find ./ -size  47k -size -89k
    
    find ./ -maxdepth 2 -type d
    
    find ./ -maxdepth 1 -name "*.sh" -exec rm -r {} ;
    
    find ./ -maxdepth 1 -name "*.sh" -ok rm -r {} ;
    
    find ./ -maxdepth 1 -type f -print0 | xargs -0 ls -lh
    
    find ./ -name "*.gz" -mtime -5 -exec ls -lh {} /;
    

规则语句和循环语句

看起来基本和C同样,框架如下——

if (条件表达式)
    动作1
[else
    动作2]

while(条件表达式)
    动作

do
    动作
while(条件表达式)

for(设置计数器初值; 测试计数器; 计数器变化)
    动作
实例:测试~运算符

awk ‘BEGIN{FS=”:”} $1~/root/’ input awk 条件语句
与C类似,有if,if/else,if/else if/else
awk ‘BEGIM{FS=”:”}{if(1 /root/)print0}’ passwd

awk

  • sed以行为单位拍卖文件,awk比sed强的地点在于不仅能以行为单位还是能够以列为单位拍卖文件。awk缺省的行分隔符是换行,缺省的列分隔符是接连的空格和Tab,但是行分隔和列分隔符都得以自定义,比如/etc/passwd文件的每一行有好四个字段,字段之间以:分隔,就足以另行定义awk的列分隔符为:并以列为单位管理这一个文件。awk实际上是一门很复杂的脚本语言,还会有像C语言同样的分支和巡回结构,不过基本用法和sed类似,awk命令行的着力方式为:

      awk option 'script' file1 file2 ...
      awk option -f scriptfile file1 file2 ...
    
  • 和sed同样,awk管理的文件不仅能够由正规输入重定向得到,也得以当命令行参数字传送入,编辑命令能够间接当命令行参数字传送入,也足以用-f参数钦定二个本子文件,编辑命令的格式为:

      /pattern/{actions}
      condition{actions}
    
  • 和sed类似,pattern是正则表明式,actions是一多元操作。awk程序一行一行读出待管理公事,要是某一行与pattern相配,或许满足condition条件,则实施相应的actions,尽管一条awk命令唯有actions部分,则actions效用于待管理文件的每一行。比方文件testfile的内容表示某商城的库存量:

      ProductionA 30
      ProductionB 76      
      ProductionC 55
    
  • 打字与印刷每一行的第二列:

      $ awk '{print $2;}' testfile
      30
      76
      55
    
  • 活动变量$1、$2分级代表第一列、第二列等,类似于Shell脚本的职位参数,而$0表示一切当前行。再比方,假设某种产品的仓库储存量低于75则在末行声明要求预定:

      $ awk '$2<75 {printf "%st%sn", $0, "REORDER";} $2>=75 {print $0;}' testfile
      ProductionA 30 REORDER
      ProductionB 76      
      ProductionC 55 REORDER
    
  • 可知awk也是有和C语言非常相像的printf函数。awk命令的condition部分还是可以够是多个例外的condition——BEGIN和END,对于每一个待管理文件,BEGIN后边的actions在拍卖整个文件从前执行叁遍,END前边的actions在全路文件管理完以往实行三次。

  • awk命令能够像C语言同样采取变量(但无需定义变量),比如总结贰个文本中的空行数

      $ awk '/^ *$/ {x=x 1;} END {print x;}' testfile
    
  • 就像Shell的情状变量一样,有个别awk变量是预约义的有非常含义的:

    • awk常用的内建变量

        FILENAME    当前输入文件的文件名,该变量是只读的
        NR          当前行的行号,该变量是只读的,R代表record
        NF          当前行所拥有的列数,该变量是只读的,F代表field
        OFS         输出格式的列分隔符,缺省是空格
        FS          输入文件的列分隔符,缺省是连续的空格和Tab
        ORS         输出格式的行分隔符,缺省是换行符
        RS          输入文件的行分隔符,缺省是换行符
      
  • 比方打字与印刷系统中的用户帐号列表

      $ awk 'BEGIN {FS=":"} {print $1;}' /etc/passwd
    
  • awk也得以像C语言同样选择if/else、while、for调控结构。可机关扩大学习。

sed

  • sed意为流编辑器(Stream 艾德itor),在Shell脚本和Makefile中作为过滤器使用十三分常见,也正是把前边三个主次的输出引进sed的输入,经过一名目好些个编写制定命令调换为另一种格式输出。sed和vi都源于开始的一段时期UNIX的ed工具,所以广大sed命令和vi的末行命令是同样的。
  • sed命令行的着力格式为:

    sed option 'script' file1 file2 ...
    sed option -f scriptfile file1 file2 ...
    
  • 选择含义:

      -n, --quiet, --silent
                     静默输出,默认情况下,sed程序在所有脚本指令执行完毕后,
                     将自动打印模式空间中的内容,这些选项可以屏蔽自动打印。
    
      -e 脚本, --expression=脚本
                     允许多个脚本指令被执行。
    
      -f 脚本文件, --file=脚本文件
                     从文件中读取脚本指令,对编写自动脚本程序来说很棒!
    
      --follow-symlinks
                     直接修改文件时跟随软链接
    
      -i[SUFFIX], --in-place[=SUFFIX]
                     直接修改源文件,经过脚本指令处理后的内容将被输出至源文件
                    (源文件被修改)慎用!
    
      -l N, --line-length=N
                     该选项指定l指令可能输出的行长度,l指令用于输出非打印字符。
    
      --posix
                     禁用GNU sed扩展功能。
    
      -r, --regexp-extended
                     在脚本指令中使用扩展正则表达式
    
      -s, --separate
                     默认情况下,sed将把命令行指定的多个文件名作为一个长的连续的输入流。
                     而GNU sed则允许把他们当作单独的文件,这样如正则表达式则不进行跨文件匹配。
    
      -u, --unbuffered
                     从输入文件读取最少的数据,更频繁的刷新输出
    
      -z, --null-data
                     separate lines by NUL characters
          --help     显示帮助文档
          --version  显示sed版本。
    
      - 如果没有 -e, --expression, -f 或 --file 选项,那么第一个非选项参数被视为
        sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准
        输入读取数据。
    
  • 以上仅是sed程序本身的选项功效表达,至于具体的台本指令(即对文件内容做的操作)前边大家会详细描述,这里大概介绍多少个本子指令操作作为sed程序的例子。

    a,  append          追加
    i,  insert          插入
    d,  delete          删除
    s,  substitution    替换
    
  • 如:$ sed "2a test" ./testfile在出口testfile内容的第二行后增加"test"。

    $ sed "2,5d" testfile
    
  • sed管理的文件不仅能够由正规输入重定向得到,也得以当命令行参数字传送入,命令行参数能够一回传入多少个公文,sed会依次拍卖。sed的编辑撰写命令能够一向当命令行参数传入,也能够写成三个剧本文件然后用-f参数钦赐,编辑命令的格式为:

    /pattern/action
    
  • 里头pattern是正则表明式,action是编写操作。sed程序一行一行读出待管理公事,倘若某一行与pattern相配,则进行相应的action,假若一条命令未有pattern而唯有action,那些action将成效于待处理文件的每一行。

  • 常用sed命令

    /pattern/p  打印匹配pattern的行
    /pattern/d  删除匹配pattern的行
    /pattern/s//pattern1/pattern2/  查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2   
    /pattern/s//pattern1/pattern2/g  查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2
    
    • 动用p命令需求小心,sed是把待管理文件的故事情节及其管理结果一齐输出到正规输出的,因而p命令表示除了把公文内容打字与印刷之外还特出打字与印刷二回相配pattern的行。比方四个文书testfile的剧情是

      123
      abc
      456
      
    • 打字与印刷在那之中带有abc的行

      $ sed '/abc/p' testfile
      123
      abc
      abc
      456
      
    • 要想只输出处理结果,应丰裕-n选项,这种用法相当于grep命令

      $ sed -n '/abc/p' testfile
      abc
      
    • 选拔d命令就无需-n参数了,举个例子删除含有abc的行

      $ sed 'abc/d' testfile
      123
      456
      
    • 专注,sed命令不会修改原作件,删除命令只代表某个行不打字与印刷输出,而不是从原来的文章件中去除。

    • 选拔查找替换命令时,能够把相称pattern1的字符串复制到pattern第22中学,举例:

      $ sed 's/bc/-&-/' testfile
      123
      a-bc-
      456
      
    • 再比如:

      $ sed 's/([0-9])([0-9])/-1-~2~/' testfile
      -1-~2~3
      abc
      -4-~5~6
      
    • pattern2中的1代表与pattern1的率先个()括号相相配的剧情,2象征与pattern1的第二个()括号相相称的原委。sed暗中认可使用Basic正则表达式标准,假如内定了-r选项则使用Extended标准,那么()括号就无须转义了。如:

      $ sed -r 's/([0-9])([0-9])/-1-~2~/' testfile
      
    • 轮换截至后,全部行,含有再而三数字的首先个数字前后都增添了"-"号;第贰个数字前后都增添了“~”号。

    • 可以贰次钦赐多条分歧的交替命令,用“;”隔断:

      $ sed 's/yes/no/; s/static/dhcp/' testfile
      注:使用分号隔开指令。
      
    • 也足以利用-e参数来钦定分歧的交替命令,有多少个替换命令需增多多少个-e参数:

      $ sed -e 's/yes/no/' -e 's/static/dhcp/' testfile
      注:使用-e选项
      
    • 假诺testfile的原委是

      <html><head><title>Hello World</title></head>
      <body>Welcome to the world of regexp!</body></html>
      
    • 近些日子要去掉全部的HTML标签,使输出结果为:

      Hello World
      Welcome to the world of regexp!
      
    • 如何是好吧?如若用下边包车型客车命令

      $ sed 's/<.*>//g' testfile
      
    • 结果是四个空行,把持有字符都过滤掉了。那是因为,正则表达式中的数量限制符会相配尽大概长的字符串,这称为贪心的(Greedy)。比方sed在拍卖第一行时,<.*>相配的并不是或那样的标签,而是

      <html><head><title>Hello World</title></head>
      
    • 那样一整行,因为这一行开头是<,中间是多少个随机字符,末尾是>。那么那条命令怎么改才对吗?留给同学们想想。

数组

数组是积存一层层值的变量,可因此索引来访问数组的值,索引要求用中括号括起,数组的核心格式为:

array[index]=value

方式和C同样,但awk数组无需定义数组类型和尺寸,能够平昔赋值后采纳。一般用在for循环中

for (variable in array)
    do somethng with array[variable]

愈来愈多操作能够查阅:http://man.linuxde.net/awk

参考:Linux Shell编制程序——从初学到通晓(第2版)

表达式

支持加( ),减(-),乘(*),除(/),模(%),乘方(^或**),自增( x,x )
一个表明式可由数值,字符常量,变量,操作符,函数和正则表达式

C程序中使用正则

  • POSIX规定了正则表明式的C语言库函数,详见regex(3)。大家早已学习了成百上千C语言库函数的用法,读者应当负有自身看懂man手册的力量了。本章介绍了正则表明式在grep、sed、awk中的用法,学习要能够融会贯通,请读者依照regex(3)本人总计正则表达式在C语言中的用法,写一些签单的先后,举个例子验证用户输入的IP地址或email地址格式是或不是准确。
  • C语言处理正则表明式常用的函数有regcomp()、regexec()、regfree()、regerror(),一般分为四个步骤,如下所示:
    • 1、编写翻译正则表明式regcomp()
    • 2、相配正则表明式regexec()
    • 3、释放正则表明式regfree()
  • 上边是对多少个函数的事无巨细解释

    • 1、regcomp()那些函数把内定的正则表明式pattern编写翻译成一种特定的数量格式compiled,那样能够使格外更实用。函数regexec会采取那些数目在目的文本串中开始展览方式相称。试行成功重返0。
      • int regcomp(regex_t *compiled, const char *pattern, int cflags)
      • regex_t:是二个结构休数据类型,用来存放编写翻译后的正则表明式,它的积极分子re_nsub用来存款和储蓄正则表明式中的子正则表明式的个数,子正则表明式就是用圆括号包起来的局部表明式。
      • pattern:是指向大家写好的正则表明式的指针。
      • cflags有如下4个值恐怕是它们或运算(|)后的值:
        • REG_EXTENDED:以效果更加强大的恢弘正则表达式的点子开始展览相称。
        • REG_ICASE:相称字母时忽略大小写
        • REG_NOSUB:不用存款和储蓄相称后的结果,只回去是还是不是成功相配。假使设置该标识位,那么在regexec将忽略nmatch和pmatch五个参数。
        • REG_NEWLINE:识别换行符,那样'$'就足以从行尾开头相称,'^'就足以从行的按钮开首相称。
    • 2、当大家编写翻译好正则表达式后,就能够用regexec相配大家的靶子文本串了,要是在编写翻译正则表达式的时候从不点名cflags的参数为REG_NEWLINE,则暗中同意情状下是忽视换行符的,也等于把方方面面文本串当作二个字符串管理。

      • 执行成功重回0。
      • regmatch_t是二个结构体数据类型,在regex.h中定义:

          typedef struct {
              regoff_t rm_so;
              regoff_t rm_eo;
          } regmatch_t;
        
      • 成员rm_so存放相称文本串在指标串中的初步地点,rm_eo存放停止地方。平日我们以数组的款型定义一组那样的协会。因为一再大家的正则说明式中还包蕴子正则表明式。数组0单元存放主正则表明式地点,前边的单元依次存修正则表明式地方。

      • int regexec(regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr[], int eflags)
        • compiled:是曾经用regcomp函数编写翻译好的正则表达式。
        • string:是指标文本串。
        • nmatch:是regmatch_t结构体数组的长短。
        • matchptr:regmatch_t类型的构造体数组,存放相配文本串的岗位新闻。
        • eflags有三个值:
          • REG_NOTBOL:让出色字符^无效果。
          • REG_NOTEOL:让优秀字符$无意义。
    • 3、当大家运用完编写翻译好的正则表明式后,只怕要双重编写翻译其余正则表明式的时候,大家能够用那些函数清空compiled指向的regex_t结构体的内容,请牢记,假如是再度编写翻译的话,一定要先清空regex_t结构体。

      • void regfree(regex_t *compiled)
    • 4、当实行regcomp只怕regexec爆发错误的时候,就能够调用那么些函数而回到贰个富含错误音讯的字符串。
      • size_t regerror(int errcode, regex_t *compiled, char *buffer, size_t length)
        • errcode:是由regcomp和regexec函数重返的谬误代号。
        • compiled:是早已用regcomp函数编译好的正则表明式,那几个值可认为NULL。
        • buffer:指向用来存放在错误音信的字符串的内部存款和储蓄器空间。
        • length:指明buffer的长度,假使那么些错误消息的尺寸超越那一个值,则regerror函数会自行截断越过的字符串,但他依然会回到完整的字符串的长度。所以大家得以用如下的措施先获得错误字符串的长短。
        • 例如:size_t length = regerror(errcode, compiled, NULL, 0);
    • 测试用例:

        #include <sys/types.h>
        #include <regex.h>
        #include <stdio.h>
      
        int main(int argc, char *argv[])
        {
            if(argc != 3){ 
                printf("Usage: %s RegexString And Textn", argv[0]);
            }   
      
            const char * p_regex_str = argv[1];
            const char * p_txt = argv[2];
            //编译后的结构体
            regex_t oregex;
            int ret = 0;
            //保存错误信息的数组
            char emsg[1024] = {0};
            size_t emsg_len = 0;
      
            //编译正则表达式, 扩展正则
            if((ret = regcomp(&oregex, p_regex_str, REG_EXTENDED|REG_NOSUB)) == 0){ 
                //执行匹配,不保存匹配的返回值
                if((ret = regexec(&oregex, p_txt, 0, NULL, 0)) == 0){ 
                    printf("%s matches %sn", p_txt, p_regex_str);
                    regfree(&oregex);
                    return 0;
                }   
            }   
      
            //正则编译错误,存emsg中错误描述
            emsg_len = regerror(ret, &oregex, emsg, sizeof(emsg));
            //错误信息较长特殊情况
            emsg_len = emsg_len < sizeof(emsg)? emsg_len : sizeof(emsg) - 1;
      
            emsg[emsg_len] = '';
            printf("Regex error Msg: %sn", emsg);
      
            regfree(&oregex);
      
            //非正常退出                                                                                             
            return 1;
        }
      
    • 极度网站:

        ./a.out "http://www..*.com" "http://www.taobao.com"
      
    • 合营邮箱:

        ./a.out "^[a-zA-Z0-9.] @[a-zA-Z0-9] .[a-zA-Z0-9] " "abc.123@126.com"
        ./a.out "w ([- .]w )*@w ([- .]w )*.w ([- .]w )*" "abc@qq.com"
      
    • 特别固话号码:请同学们融洽编辑。

    • 除去GNU提供的函数外,还常用PCRE管理正则,全称是Rerl Compatible Regular Expressions。从名字咱们得以看到PCRE库是与Perl中正则表明式匹合作的一个正则表明式库。PCRE是免费开源的库,它是由C语言完成的,这里是它的官方主页:
    • PCRE 是三个对PCRE库的C 封装,它提供了一发有利于、易用的C 接口。这里是它的官方主页:

awk

  • sed以行为单位拍卖文件,awk比sed强的地点在于不只能以行为单位仍是能够以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列分隔符是连连的空格和Tab,不过行分隔和列分隔符都得以自定义,例如/etc/passwd文件的每一行有几个字段,字段之间以:分隔,就可以重复定义awk的列分隔符为:并以列为单位管理那一个文件。awk实际上是一门很复杂的脚本语言,还应该有像C语言同样的支行和巡回结构,但是基本用法和sed类似,awk命令行的宗旨情势为:

    awk option 'script' file1 file2 ...
    awk option -f scriptfile file1 file2 ...
    
  • 和sed一样,awk管理的文件既可以够由正规输入重定向得到,也得以当命令行参数传入,编辑命令能够直接当命令行参数字传送入,也足以用-f参数钦命一个本子文件,编辑命令的格式为:

    /pattern/{actions}
    condition{actions}
    
  • 和sed类似,pattern是正则表达式,actions是一雨后冬笋操作。awk程序一行一行读出待管理公事,若是某一行与pattern相称,或然满足condition条件,则执行相应的actions,如若一条awk命令只有actions部分,则actions成效于待管理文件的每一行。例如文件testfile的内容表示某集团的仓库储存量:

    ProductionA 30
    ProductionB 76      
    ProductionC 55
    
  • 打字与印刷每一行的第二列:

    $ awk '{print $2;}' testfile
    30
    76
    55
    
  • 自行变量$1、$2分级代表第一列、第二列等,类似于Shell脚本的职位参数,而$0表示全数当前行。再比方,如若某种产品的仓库储存量低于75则在末行标记供给预定:

    $ awk '$2<75 {printf "%st%sn", $0, "REORDER";} $2>=75 {print $0;}' testfile
    ProductionA 30 REORDER
    ProductionB 76      
    ProductionC 55 REORDER
    
  • 可知awk也是有和C语言非常相似的printf函数。awk命令的condition部分还足以是五个特殊的condition——BEGIN和END,对于每一种待管理文件,BEGIN后边的actions在拍卖任何文件在此以前实践贰次,END前边的actions在全部文件管理完现在推行一回。

  • awk命令能够像C语言同样采纳变量(但无需定义变量),比如总计一个文件中的空行数

    $ awk '/^ *$/ {x=x 1;} END {print x;}' testfile
    
  • 就像Shell的遇到变量同样,有个别awk变量是预约义的有例外意义的:

    • awk常用的内建变量

      FILENAME    当前输入文件的文件名,该变量是只读的
      NR          当前行的行号,该变量是只读的,R代表record
      NF          当前行所拥有的列数,该变量是只读的,F代表field
      OFS         输出格式的列分隔符,缺省是空格
      FS          输入文件的列分隔符,缺省是连续的空格和Tab
      ORS         输出格式的行分隔符,缺省是换行符
      RS          输入文件的行分隔符,缺省是换行符
      
  • 比如打印系统中的用户帐号列表

    $ awk 'BEGIN {FS=":"} {print $1;}' /etc/passwd
    
  • awk也得以像C语言同样选取if/else、while、for调控结构。可机关扩充学习。

实例

1.总括空白行数
awk ‘/^$/{x =1}END{print x}’ input
2.计量平均成绩
awk ‘BEGIN{FS=”,”}{total=4 5 6 7;avg=total/4;print $1,avg}’ input

C程序中选择正则

  • POSIX规定了正则表明式的C语言库函数,详见regex(3)。大家曾经学习了众多C语言库函数的用法,读者应当具有自身看懂man手册的力量了。本章介绍了正则表达式在grep、sed、awk中的用法,学习要能够投砾引珠,请读者依据regex(3)本人总计正则表明式在C语言中的用法,写一些签单的先后,比方验证用户输入的IP地址或email地址格式是或不是科学。
  • C语言处理正则表明式常用的函数有regcomp()、regexec()、regfree()、regerror(),一般分为三个步骤,如下所示:
    • 1、编写翻译正则表明式regcomp()
    • 2、相称正则表明式regexec()
    • 3、释勘误则表明式regfree()
  • 下边是对两个函数的事无巨细解释

    • 1、regcomp()那几个函数把钦定的正则表明式pattern编译成一种特定的数目格式compiled,这样能够使优异更使得。函数regexec会选拔那几个数目在目的文本串中开始展览格局相配。执行成功重临0。
      • int regcomp(regex_t *compiled, const char *pattern, int cflags)
      • regex_t:是七个结构休数据类型,用来存放编写翻译后的正则表明式,它的积极分子re_nsub用来存款和储蓄正则表明式中的子正则表达式的个数,子正则表达式便是用圆括号包起来的局部表明式。
      • pattern:是指向大家写好的正则表明式的指针。
      • cflags有如下4个值恐怕是它们或运算(|)后的值:
        • REG_EXTENDED:以效果更压实大的庞大正则表明式的法子开展相配。
        • REG_ICASE:相配字母时忽略大小写
        • REG_NOSUB:不用存款和储蓄相配后的结果,只回去是或不是成功相称。假设设置该标识位,那么在regexec将忽略nmatch和pmatch七个参数。
        • REG_NEWLINE:识别换行符,那样'$'就足以从行尾开头相配,'^'就能够从行的按键开首相配。
    • 2、当大家编写翻译好正则表明式后,就可以用regexec相称大家的对象文本串了,假设在编写翻译正则表达式的时候从不点名cflags的参数为REG_NEWLINE,则私下认可情状下是忽视换行符的,相当于把全副文本串当作三个字符串管理。

      • 实行成功重返0。
      • regmatch_t是四个结构体数据类型,在regex.h中定义:

        typedef struct {
            regoff_t rm_so;
            regoff_t rm_eo;
        } regmatch_t;
        
      • 成员rmso存放相称文本串在指标串中的早先地点,rmeo存放停止地点。经常我们以数组的样式定义一组那样的协会。因为屡次大家的正则表达式中还包罗子正则表明式。数组0单元存放主正则表明式地点,后面的单元依次存放正则表达式地点。

      • int regexec(regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr[], int eflags)

        • compiled:是曾经用regcomp函数编写翻译好的正则表达式。
        • string:是指标文本串。
        • nmatch:是regmatch_t结构体数组的长度。
        • matchptr:regmatch_t类型的组织体数组,存放相配文本串的岗位音信。
        • eflags有多个值:
          • REG_NOTBOL:让特殊字符^无效益。
          • REG_NOTEOL:让特殊字符$无效劳。
    • 3、当大家选用完编译好的正则表明式后,大概要再一次编写翻译其余正则表明式的时候,大家得以用这么些函数清空compiled指向的regext结构体的剧情,请牢记,固然是重新编写翻译的话,一定要先清空regext结构体。

      • void regfree(regex_t *compiled)
    • Linux文本管理命令。4、当施行regcomp也许regexec发生错误的时候,就足以调用这一个函数而回到二个饱含错误新闻的字符串。

      • size_t regerror(int errcode, regex_t *compiled, char *buffer, size_t length)
        • errcode:是由regcomp和regexec函数再次来到的错误代号。
        • compiled:是早就用regcomp函数编写翻译好的正则表明式,那个值可以为NULL。
        • buffer:指向用来存放错误消息的字符串的内部存储器空间。
        • length:指明buffer的尺寸,借使那些错误音信的长短当先这一个值,则regerror函数会自动截断超过的字符串,但她照样会回来完整的字符串的尺寸。所以我们能够用如下的章程先得到错误字符串的长度。
        • 例如:size_t length = regerror(errcode, compiled, NULL, 0);
    • 测试用例:

      #include <sys/types.h>
      #include <regex.h>
      #include <stdio.h>
      
      int main(int argc, char *argv[])
      {
          if(argc != 3){ 
              printf("Usage: %s RegexString And Textn", argv[0]);
          }   
      
          const char * p_regex_str = argv[1];
          const char * p_txt = argv[2];
          //编译后的结构体
          regex_t oregex;
          int ret = 0;
          //保存错误信息的数组
          char emsg[1024] = {0};
          size_t emsg_len = 0;
      
          //编译正则表达式, 扩展正则
          if((ret = regcomp(&oregex, p_regex_str, REG_EXTENDED|REG_NOSUB)) == 0){ 
              //执行匹配,不保存匹配的返回值
              if((ret = regexec(&oregex, p_txt, 0, NULL, 0)) == 0){ 
                  printf("%s matches %sn", p_txt, p_regex_str);
                  regfree(&oregex);
                  return 0;
              }   
          }   
      
          //正则编译错误,存emsg中错误描述
          emsg_len = regerror(ret, &oregex, emsg, sizeof(emsg));
          //错误信息较长特殊情况
          emsg_len = emsg_len < sizeof(emsg)? emsg_len : sizeof(emsg) - 1;
      
          emsg[emsg_len] = '';
          printf("Regex error Msg: %sn", emsg);
      
          regfree(&oregex);
      
          //非正常退出                                                                                             
          return 1;
      }
      
    • 相称网站:

      ./a.out "http://www..*.com" "http://www.taobao.com"
      
    • 卓殊邮箱:

      ./a.out "^[a-zA-Z0-9.][email protected][a-zA-Z0-9] .[a-zA-Z0-9] " "[email protected]"
      ./a.out "w ([- .]w )*@w ([- .]w )*.w ([- .]w )*" "[email protected]"
      
    • 合作固话号码:请同学们团结编排。

    • 除外GNU提供的函数外,还常用PCRE处理正则,全称是Rerl Compatible Regular Expressions。从名字大家能够见见PCRE库是与Perl中正则表明式相包容的多个正则表明式库。PCRE是无需付费开源的库,它是由C语言完结的,这里是它的官方主页:

    • PCRE 是三个对PCRE库的C 封装,它提供了尤其有益于、易用的C 接口。这里是它的官方主页:

Shell历史 Shell的机能是表达用户的授命,用户输入一条命令,Shell就表明实行一条,那条措施叫做交互式(interactive),...

系统变量

变量 意义
$n 当前记录的第n个域,域间由FS分隔
$0 记录的所有域
FS 字段分隔符,默认空格
RS 记录分隔符,默认换行
NR 当前记录数
NF 当前记录中的域数量
OFS 输出域分隔符,默认空格
ORS 输出记录分隔符,默认换行
FILENAME 当前文件名
ARCC 命令行参数的数量
ARGIND 命令行中当前文件的位置(从0开始标号)
ARGV 命令行参数数组
CONVEMT 数字转换格式
ENVIRON 环境变量关联数组
ERRNO 最后一个系统错误的描述
FILEDWIDTHS 字段宽度列表,以空格键分隔
FIR 浏览文件的记录数
IGNORECASE 布尔变量,如果为真,则进行忽略大小写的匹配
OFMT 数字的输出格式
RLENGTH 由match函数匹配的字符串长度
RSTART 由match函数所匹配的字符串的第一个位置
SUBSEP 数组下标分隔符,默认值是34

格式化输出

awk的一大体义是发出报表,报表就须要根据约定的格式化输出
printf(格式调控符,参数)

修饰符 意义
- 左对齐
width 域的步长
.prec 小数点右边的位数
0 1 2 3 4 5 6 7
格式符 %c %d %e %f %o %x %s

置于字符串函数

函数名 意义
gsub(r,s) 在输入文件中用s替换r,作用域为$0
gsub(r,s,t) 在t中用s替换r,可以作用于某个域$n
index(s,t) 返回s中字符串第一个t的位置
length(s) 返回s的长度
match(s,t) 测试s是否包含匹配t的字符串
split(r,s,t) 用t分隔r,生成数组s,生成数组的元素个数
sub(r,s,t) 将t中第一次出现的r替换为s
substr(r,s) 返回字符串r中从s开始的后缀部分
substr(r,s,t) 返回字符串r中从s开始长度为t的后缀部分
实例

awk ‘BEGIN{FS=”:”;OFS=”:”} gsub(/root/,”gridsphere”,$1)’ input awk ‘BEGIN{FS=”:”;OFS=”:”} gsub(/root/,”gridsphere”){print $0}’ input awk ‘BEGIN{print index(“gridsphere”,”ph”)}’ awk ‘BEGIN{print length(“gridsphere”)}’ awk ‘BEGIN{print match(“hello”,/h.*/)}’

向awk脚本传递参数

awk脚本内的变量能够在指令行中进行赋值,达成awk脚本传递参数,变量赋值放在脚本之后、输入文件在此以前,如
awk脚本 parameter=value 输入文件
awk传递的参数能够是自定义的,也能够是系统变量

基准语句和循环语句

if() 动作1 [else 动作2]
while() 动作
do 动作 while()
for()动作

数组

array[index]=value
1.关乎数组
提到数组是指数组的目录能够是字符串,也得以是数字
涉及数组的值无须以三番五次的地址实行仓储。
awk的享有数组都是涉嫌数组。使用的数字索引并不表示数组存款和储蓄地方音讯
走访数组:
for(variable in array) do something with array[variable]
推断数组中是否留存某元素
if(index in array) do
2.split函数
split(r,s,t):以t为分隔符,将r字符串拆分为字符串数组,并存放在s中
awk ‘BEGIN{print split(“abc/def/ghi”,str,”/”);for(i in str) print str[i]}’

文本管理命令

文本处理命令包罗对文本记录的排序、文件的会集和分隔等。具体命令:sort,uniq,join,cut,paste,split,tr,tar。这几个命令完毕了对文件记录排序,总计,合并,提取,粘贴,分隔,过滤,压缩和平消除压等功能。与sed,awk构成了Linux文本管理的保有命令和工具

sort

rt:对文件举办排序。将输入文件作为由多条记下组成的数据流,而记录由可变宽度的字段组成。,以换行符作为定界符,sort命令与awk同样,可将记录分成七个域举行管理,暗中同意的域分隔符是空格符

sort [选项] [输入文件]

选项 意义
-c 测试文件是否已经被排序
-k 指定排序的域
-m 合并两个已排序的文件
-n 根据数字大小进行排序
-o[输出文件] 将输出写入到指定的文件,相当于将输出重定向到指定文件
-r 将排序结果逆向显示
-t 改变域分隔符
-u 去除结果中的重复行

sort -t: input sort -t: -k3 input sort -t: -k3n input
-n一般不独立使用,一般位于域号之后 sort -t: -k3nr input sort -t: -u input sort -t: -k3n -o output input sort -t: -c input sort -t: -m input1 input2
input1和input2必须有序

uniq

用于去除文本文件中的一连的再度行,类似sort -u

选项 意义
-c 只打印每行在文本中重复出现的次数
-d 只显示有重复的记录,每个重复记录只出现一次
-u 只显示没有重复的记录

总括文件中的单词数
cat input | sed ‘s/./ /g;s/=/ /g;s/,/ /g;s/// /g;s/ /n/g;s/t/n/g’| sed ‘/^$/d’|sort| uniq -c | sort -nr

join

再三再四操作将三个公文中具有同样域的记录采纳出来,再将那一个记录全体的域放到一行(包括来自三个公文的全数域)
注意:文件必须有序

选项 意义
-a1或-a2 除了显示以共同域进行连接的结果外,-a1表示还显示第一个文件中没有共同域的记录,-a2则表示显示第二个文件中没有共同域的记录
-i 比较域内容时,忽略大小写差异
-o 设置结果显示的格式
-t 改变域分隔符
-v1或-v2 与-a类似,但是,不显示以共同域进行连接的结果
-1和-2 -1用于设置文件1用于连接的域,-2用于设置文件2用于连接的域

join [选项] file1 file2
有点像sql中的join

join -t: teacher.db teacher_hobby.db
暗中认可第一个域相比较,相等就接二连三。 -a有一点像左外连接,右外连接
-a1 左连接 -a2右连接 -o表示呈现那一个域(sql中的字段)
代表方法为 -o1.n 2.n -i忽略大小写 -t设置域分隔符 -v取反,即不显得共同域
用法与-a类似,-v1 -v2 -1,-2表示用来接二连三的域

实例

对于几个域的连日,使用awk

awk ’
//(N君越代表读取的记录数,FN昂科威表示在当下文件中的记录数,唯有首先个文件技能使得NKoleos==FNR)
NR==FNR
{
a[$1 FS $2]=$0;
//相当于break,本行处理完结,管理下一行
next;
}
//最后实行到此处时,a中储存的是文件1中的记录
//当文件2的$1 FS $2在a中证实四个公文这两行同样
$1 FS$2 in a
{
//将钦命列相等的记录存款和储蓄在b中
b[FNR]=a[$1 FS $2] FS $3
}
END
{
//打印
//awk中的数组是关联数组
for(i=1;i<=FNR;i )
if(i in b)
print b[i]
}’
test1 test2

cut

cut命令用于从专门的学问输入或文本文件中按域或按行提取文本

选项 意义
-c 指定提取的字符数或字符范围
-f 指定提取的域数或域范围
-d 改变域分隔符

-c按字符提取文本
cut -c2 input
cut -c1,5 input(提取第1个和第5个字符)
cut -c1-5 input(提取1~5这三个字符) -f按域提取文本 -d类似sort和join中的-t

paste

用来将文件文件或正式输出中的内容粘贴到新的文本,它可以以往自差异文件的数目粘贴到共同,产生新的文件。借使四个文本的行数分化,少的十三分为空

paste [选项] 文件1 文件2…

选项 意义
-d 默认域分隔符是空格或Tab键,设置新的域分隔符
-s 将每个文件粘贴成一行
- 从标准输入中读取数据

split

用以将大文件切割成小文件,split命令能够依据文件的行数,字节数切割文件,并能在输出的多少个文本中活动抬高编号

split [选项] 待切割的大文件 输出的小文件

选项 意义
-n 用于指定切割成小文件的行数
-b 指定切割成小文件的字节
-C 与-b类似,但是,切割时尽量维持每行的完成性

split -2 input input(默认是x) split -b100 input input split -C100 input input

tr

现字符调换职能,tr能到位的sed都能变成,可是tr轻便

tr [选项] 字符串1 字符串2 < 输入文件

选项 意义
-c 反选字符串1的字符集
-d 删除字符串1中出现的所有字符
-s 删除所有重复出现的字符序列,只保留一个

tar

归档命令,达成了包装和解压文件

tar [选项] 文件名或目录名

选项 意义
-c 创建新的包
-x 解压文件
-t 列出包内容
-f 使用压缩文件或设备,该选项通常是必须的
-z 用gzip压缩和解压缩文件,若加上此选项创建压缩包,那么解压缩时也需要加上此选项
-j bz2
-v 查看过程
-r 向宝中添加文件

gzip 压缩文件

Linux文本处理总计

Linux文本处理命令 应用
grep 全面搜索正则表达式并把行打印出来,grep命令族:grep,egrep,fgrep
sed 流编辑,将一系列编辑命令作用于缓冲区中输入文件的副本,从而实现输入文件的各种编辑操作
awk 特点是处理结构化文件,所谓结构化,指划分为域和记录的文件
sort 对文本进行排序
uniq 去除文本的连续重复行,也可以统计重复行的数量
join 类似数据库中的连接操作
cut 从标准输入或输入文件中按行或按域提取文本
paste 用于将多个文件或标准输出中的内容粘贴而形成新的文件
split 用于将大文件切割成小文件
tr 实现字符替换功能,可以实现文本文件的过滤功能
tar 归档命令,和gzip用于实现Linux系统文件的压缩和解压

 

正则表达式 POSIX标上校正则表达式分为两类 1.中央的正则表达式 2.扩展的正则表达式 一大半Linux应用和工具仅帮助大旨的...

本文由澳门新浦京娱乐场网站发布于澳门新浦京娱乐场网站,转载请注明出处:Linux文本管理命令