天天看点

linux command Line and shell script bible(笔记十三)

这是暑假回来看linux命令行与shell脚本编程大全的一些笔记,并不是全部的,只是结合本人觉得需要的一些记录,在整理发表博文时也当作一种回顾!欢迎交流指正!!

18.1.1 sed编辑器:每次从输入中读取一行,用提供的编辑器命令匹配数据、按命令中指定的方式修改流中的数据,然后将生成的数据输出到STDOUT

*在流编辑器将所有命令与一行数据进行匹配之后,它会读取下一行数据并重复这个过程,知道处理完流中所有数据。

*sed编辑器自身不会修改文本文件的数据,原数据不会改变

*使用sed命令的格式: sed option script file

##########sed命令选项################################################

-e script    在处理输入时,将script中指定的命令添加到运行的命令中

-f file        在处理输入时,将file中指定的命令添加到运行的命令中

-n        不要为每个命令生成输出,等待print命令来输出

#####################################################################

*script参数指定了将作用在流数据上的单个命令,如果要多个命令,就必须用-e选项来在命令行上指定它们,或用-f选项来在单独的文件中指定。

1.在命令行定义编辑器命令

 $ echo "This is a test" | sed 's/test/lijiancai/'    #s命令会用斜线间指定的第二个文本字符串来替换第一个文本字符串

2.在命令行使用多个编辑器命令,只要用-e选项,并在命令间用分号隔开,分号与命令末尾不能有空格;或者不用分号,直接回车换行,知道输入了封尾的但引号

 $ sed -e 's/one/ONE/; s/two/TWO/' data1

 $ sed -e '

 >s/one/ONE/

 >s/two/TWO/' data1   (要在封尾但因号所在行结束命令)

*命令开始后,sed命令就会将你指定的每条命令应用到文本文件上的每一行

3. 从文件中读取编辑器命令

 $ sed -f script data1    #只要将要执行的命令一行一条地写在script文件中即可,每条命令后也不用放分号

18.1.2 gawk程序

*定义变量来保存数据

*使用算术和字符串操作符来处理数据

*使用结构化编程概念

*提取数据文件中的数据元素并将它们按另一顺序或格式重新放置,从而生成格式化报告

1. gawk命令格式: gawk option program file

##################gawk选项###############################

-F fs        指定行中分隔数据字段的字段分隔符

-f file        指定读取程序的文件名

-v var=value    定义gawk程序中的一个变量及其默认值

-mf N        指定要处理的数据文件中的最大字段数

-mr N        指定数据文件中的最大数据行数

-W keyword    指定gawk的兼容模式或警告等级

########################################################

2. 从命令行读取程序脚本

*gawk程序脚本用一对花括号来定义,必须将脚本命令放到括号内,由于gawk命令行假定脚本是单个文本字符串,所有必须将脚本包括花括号放在单引号内。

$ gawk '{print "Hello"}'

执行这个命令,gawk程序会从STDIN接收数据,会一直等待从STDIN输入的数据,如果输入一行文本并按下回车,gawk就会对这行文本运行一遍所有的程序脚本

(对每行操作都是这样,要终止gawk程序,必须发出信号(按Ctrl+D)说明数据流已经结束了,否则会循环等待数据输入)

3. 使用数据字段变量

* gawk会自动给每行中的每个数据元素(数据字段)分配一个变量,默认分隔符是空格或制表符

* $0代表整个文本行

* $1代表文本行中的第一个数据字段

* $2--------------第二个数据字段

* $n--------------第n个数据字段

-F:此选项自定分隔符

$ gawk -F: '{print $1}' /etc/passwd  #指定冒号为分隔符,输出文件每行中的第一数据字段

4.在程序脚本中使用多条命令,只要在每条命令之间放个分号即可: $echo "My name is lijiancai" | gawk '{$4="yanghongyun"; print $0}'

或者在使用了但因号后,一次一行地输入一条命令,知道输入结尾的单引号。然后数据也从命令行输入,直到Ctrl+D表明数据结束

5.从文件中读取程序

$ gawk -F: -f script /ect/passwd   ##script程序脚本中写入要执行的程序命令,也是括在花括号内但不用单引号了,每行一条命令

如:

{

$3="I love you"

print $0

}

6.在处理数据前,后运行脚本

如果需要在处理数据前运行脚本,用BEGIN关键字,会强制gawk在读取数据前执行BEGIN关键字后面指定的程序脚本,

然后再用第二段程序脚本来处理任何文件数据,

处理完数据后再执行END关键字后的程序脚本。

$ gawk 'BEGIN {print "begin to run"} {print $0} END {print "End of the file"}'

18.2.1 sed编辑器基础,更多的替换选项

1. 替换标记flags: 's/pattern/replacement/flags'

*数字,表明新文本将替换第几处模式匹配的地方(因为同一行中可能有多个匹配)

*g,表明新文本将会替换所有已有匹配出现的地方

*p,表明原来行的内容要打印出来(其实是打印出修改过的行)

*w file,将替换的结果写到file文件中

-n选项与p标记配合使用则会只输出被sed命令修改过的行

2. 替换字符

$ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd  #文本行中的/就要用反斜线来转义,

$ sed 's!/bin/bash!/bin/csh!' /etc/passwd      #或者用!感叹号来做分隔符,而不是斜线

18.2.2使用地址,要将命令作用在特定行或某些行,必须用行寻址

*行的数字范围

*用文本模式来过滤出某行

[address]command 或者 address {

                command1

                command2

                }

1.数字方式行寻址:在命令中指定的地址可以是单个行号或者用起始行号、逗号和结尾行号来指定一定范围内的行。

$ sed '2s/one/ONE/' data1

$ sed '2,3s/one/ONE' data1

$ sed '2,$s/one/ONE' data1 #美元符号表示到末尾行

2.使用文本模式过滤器:命令只会作用到匹配模式的行上

命令格式:/pattern/command 匹配模式要用//括起来

$ sed '/lijiancai/s/bash/csh/' /ect/passwd

3.组合命令,可以用花括号将多条命令组合在一起,然后作用在指定的行

$ sed '2,4{

>s/one/ONE/

>s/two/TWO/

>s/three/THREE/

 }' data1

18.2.3 删除行

$ sed 'd' data1   #如果不加寻址号就会删除文本全部行、

$ sed '3d' data1

$ sed '2,3d' data1

$ sed '2,$d' data1

$ sed '/lijiancai/d' data2  删除匹配的行

或者用两个匹配模式来删除某个范围内的行,第一个配表示“打开删除”,然后就一直删除下去,然后第二个匹配表示“关闭删除” ,如果在关闭删除后再遇到匹配一的行就又会继续打开删除。

$ sed '/lijiancai/,/yanghongyun/d' data2     #会删除两个匹配指定行之间包括匹配的行。

18.2.4 插入和附加文本

*插入(insert)命令i会在指定行前增加一个新行

*追加(append)命令a会在指定行后增加一个新行

格式:sed '[address]command\

     new line'

$ echo "Test line2" | sed 'i\Test lin1'

*要插入或附加多行文本,必须对每一行使用反斜线,知道最后一行

18.2.5

修改行(其实是被指定的那一行被替换掉):修改(change)命令c运行修改数据流中整行文本的内容。用法与i,a一样

sed '3c\This is a change line of text' data2

18.2.6 转换命令y: 是唯一可以处理单个字符的sed编辑器命令。格式如下

[address]y/inchars/outchars/

*转换命令会进行inchars和outchars的值一对一映射,如果两者长度不同就会出错

*转换命令是一个全局命令,会替换文本行中找到的所有实例,而不会考虑出现的位置。(替换一行中全部匹配)

18.2.7 回顾打印

*小写p命令用来打印文本行   ###注意比较与p标记的用法

*等号(=)命令用来打印行号

*l(L的小写)命令用来列出行

如果需要在修改之前查看行,那么可以用打印命令,先打印后修改,如:

$ sed -n '2'{

  p

  s/one/ONE/p

}

这样既用p命令打印出修改前的行,又用p标记打印出修改后的行。

l命令:能将行中可见不可见的字符都打印出来,例如会把空格打印成\t之类的,甚至把颜色字符也打印出来。

18.2.8 用sed和文件一起工作

1.向文件写入

w命令用来向文件写入行,格式如下:注意比较w标记

[address]w filename   #寻址可以单个行号,文本模式或者一系列行号或文本模式

2. 从文件读取数据

读取命令r允许将一个独立文件中的数据插入到数据流中,格式如下:

[address]r filename

*寻址只能指定单独行号或文本模式地址,sed编辑器会将文件中的文本插入到地址后

*对于那些匹配行要被文件中文本替换的,可以先读入到匹配行后,然后d命令删除匹配行

$ sed '/list/'{

>r data2

>d

}' data3

这样能把data2中的数据替换了data3中匹配了list行的数据

继续阅读