sed与awk

来源:互联网 发布:监控无网络视频怎么办 编辑:程序博客网 时间:2024/06/05 18:21

sed命令(注意转义是\,sed中大多数用的是/.../)

一简介:sed是一种流式编辑器,自动编辑一个或者多个文件,简化对文件的反复操作,是文本处理中非常重要的工具,一般和正则表达式配合使用,处理时,把当前处理的行存储到行缓冲区中,称为“模式空间”,接着sed命令处理模式空间的内容并将其结果打印到屏幕,继续处理下一行不断重复,直到文件末尾,文件的内容并不改变,除非使用重定向存储输出

二命令格式

sed   [option]   'command'  file

三选项:

[option]

-i;表示改变源文件

-n;取消默认输出;

-e:多项编辑

-f:指定sed脚本的文件名

命令:

a\:i在当前行后添加一行或多行,多行时除最后一行外,每行末尾需要“\”续行;

c\:用此符号后的新文本替换当前行中的文本,多行时除最后一行外,每行末尾需要“\”续行;

i\:在当前行之前插入文本;多行时除最后一行外,每行末尾需要“\”续行;

I:列出非打印字符;

p:打印行;

q:结束或退出;

r:从文件中读取输入行;

w:将所选的行写入到文件中;

!:对所选行的以外所有行应用命令;

s:用一个字符串替换另一个;(&对前面字符串的简写)


sed元字符集

^:行开始     放到[ ]中表示括号中的内容除外;

$:行结束;

\<     \>:单词的开始或结尾;  #/\<love/p  :匹配以love开头的单词的行

.:匹配任意一个非换行符字符

*:匹配0个或多个字符;

[ ]:匹配指定范围内的字符;

[^]:匹配不在指定范围内的字符;

&:保存搜索字符用来替换其他字符;  ’s/love/**love**/‘   所有love变为**love**

\(..\):匹配字串;  如:sed -n 's/\(love\) addr/\1rs/p'

x\{m\}:重复字符x m次;

x\{3,\}:重复字符至少3次;

x\{,5\}:重复字符至多5次;(有时候用不了)

x\{3,7\}:重复字符至少3到7次;



/pattern/p:打印匹配pattern的行;(待处理文件的内容及其处理结果)

/pattern/d:删除匹配pattern的行;

/pattern/s/pattern1/pattern2/p:查找匹配pattern的行,将该行第一个匹配字符串pattern1的字符串替换为pattern2;

/pattern/s/pattern1/pattern2/pg:查找匹配pattern的行,将该行所有匹配字符串pattern1的字符串替换为pattern2;


定址:用于决定对于哪些行进行编辑,地址形式可以是数字,正则表达式或者二者的结合;

eg:

sed   -n  '2p'  file    #打印第二行;    

sed   '100,300d '  file    #删除第100行到第300行之间的内容

sed   '/start/,/end/'  file     #删除包含'start'行和‘end’行之间的行;


模式空间与保持空间;

h:模式空间的内容复制到暂存缓冲区;

H:追加

g:暂存缓冲区的内容复制到模式空间;

G:追加

x:交换暂存缓冲区和模式空间的内容;

给每行结尾添加一个空行:

[lianjiao@localhost 6_29_Regular]$ sed '1!G;h;$!d'  file654321

实现tac功能

[lianjiao@localhost 6_29_Regular]$ sed '1!G;h;$!d'  file654321


将以hello开头的行追加到末尾:

显示file1内容

[lianjiao@localhost 7_3_sed]$ cat file1hello word1111hellokitty22223333 hello
第一种方法:

[lianjiao@localhost 7_3_sed]$ sed '/^hello/H;$G' file1hello word1111hellokitty22223333 hellohello wordhellokitty
使用-e多次处理

[lianjiao@localhost 7_3_sed]$ sed -e '/^hello/H' -e '$G' file1hello word1111hellokitty22223333 hellohello wordhellokitty
注意追加之前会有空行;是因为要将模式空间中符合条件的行追加到保持空间,保持空间默认会有/n存在;再次将保持空间中的内容追加到模式空间就会讲/n也追加进入;
比如题目要求在每行之后加上空行

[lianjiao@localhost 7_3_sed]$ sed 'G' file1hello word1111hellokitty22223333 hello

行列转换:

[lianjiao@localhost 7_3_sed]$ seq 10 | tr '\n' ' '1 2 3 4 5 6 7 8 9 10 [lianjiao@localhost 7_3_sed]$ [lianjiao@localhost 7_3_sed]$ seq 10 | sed ':a;N;$!ba;s/\n/ /g'1 2 3 4 5 6 7 8 9 10[lianjiao@localhost 7_3_sed]$ seq 10 | sed ':a;N;$!ba;s/\n/,/g'1,2,3,4,5,6,7,8,9,10[lianjiao@localhost 7_3_sed]$ seq 10 | sed ':a;N;$!ba;s/\n/''/g'12345678910[lianjiao@localhost 7_3_sed]$ seq 10 | sed ':a;N;$!ba;s/\n//g'12345678910[lianjiao@localhost 7_3_sed]$ seq 10 | sed ':a;N;$!ba;s/\n//g'12345678910
注意可以替换为//,/‘’/,不可以替换为/‘ ’/

打印奇数行:

[lianjiao@localhost 7_3_sed]$ seq 10 | sed -n 'p;n' 13579
打印偶数行:
[lianjiao@localhost 7_3_sed]$ seq 10 | sed -n 'n;p' 246810



AWK

awk比sed的功能更强大,主要体现在awk不仅可以行处理文件,而且可以列处理文件;

一 格式:awk   '/pattern(rgx)/{a}' file

           awk 'condition{a}'      file

二 awk调用方式:1 命令行 awk [-F filed-seperator]  'commend'  file

        2 脚本   增加执行权限 ->  #!/usr/bin/awk  -f  ->  ./test.awk   file

  awk -f  test.awk file

三:注意问题

1记录:行 域:列

2 $1(第一列(域));   $n(第n域);$0(所有列);$NF(倒数第一列);$(NF-1):(倒数第二列)

3.awk工作流程是这样,先执行BEGIN,然后读取文件,读到\n划分的一条记录,按照域分割符将记录划分为不同的域,在进行域填充,直到所有记录都读完执行END操作;

三 例子

编写file

productA 20productB 30productC 80productD 60productE 20productF 40

提取第二域:

awk '/^productC/{print $2}' file


将第二域中>50打印YES;<50打印NO;

[lianjiao@localhost 7_3_sed]$ awk '$2>50{print $0,"YES";}$2<=50{print $0,"NO"}' fileproductA 50 NOproductB 70 YESproductC 30 NOproductD 80 YESproductE 50 NOproductF 50 NO


[lianjiao@localhost 7_3_sed]$ awk '$2>50{printf("%s,%s\n",$0,"YES")}$2<=50{printf("%s,%s\n",$0,"NO")}' file

productA 50,NOproductB 70,YESproductC 30,NOproductD 80,YESproductE 50,NOproductF 50,NO

1+.....100

[lianjiao@localhost 7_3_sed]$ seq 100 | awk 'BEGIN{i=0}{i++;sum+=i}END{print sum}'5050

两个重要选项;OFS和FS

OFS:输出域分割符;

FS:设置域分割;

[lianjiao@localhost 7_3_sed]$ awk 'BEGIN{FS="t";OFS=";"}{print $0}' fileproductA 50productB 70productC 30productD 80productE 50productF 50
注意$0会全部输出;设置分割符并不会影响结果,要想输出理想结果,$1,$2
[lianjiao@localhost 7_3_sed]$ awk 'BEGIN{FS="t";OFS=";"}{print $1,$2}' fileproduc;A 50produc;B 70produc;C 30produc;D 80produc;E 50produc;F 50






                    





原创粉丝点击