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' file
6
5
4
3
2
1
实现tac功能
[lianjiao@localhost 6_29_Regular]$ sed '1!G;h;$!d' file
6
5
4
3
2
1
将以hello开头的行追加到末尾:
显示file1内容
[lianjiao@localhost 7_3_sed]$ cat file1
hello word
1111
hellokitty
2222
3333 hello
第一种方法:
[lianjiao@localhost 7_3_sed]$ sed '/^hello/H;$G' file1
hello word
1111
hellokitty
2222
3333 hello
hello word
hellokitty
使用-e多次处理
[lianjiao@localhost 7_3_sed]$ sed -e '/^hello/H' -e '$G' file1
hello word
1111
hellokitty
2222
3333 hello
hello word
hellokitty
注意追加之前会有空行;是因为要将模式空间中符合条件的行追加到保持空间,保持空间默认会有/n存在;再次将保持空间中的内容追加到模式空间就会讲/n也追加进入;
比如题目要求在每行之后加上空行
[lianjiao@localhost 7_3_sed]$ sed 'G' file1
hello word
1111
hellokitty
2222
3333 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'
1
3
5
7
9
打印偶数行:
[lianjiao@localhost 7_3_sed]$ seq 10 | sed -n 'n;p'
2
4
6
8
10
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 20
productB 30
productC 80
productD 60
productE 20
productF 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"}' file productA 50 NO productB 70 YES productC 30 NO productD 80 YES productE 50 NO productF 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,NO productB 70,YES productC 30,NO productD 80,YES productE 50,NO productF 50,NO
1+.....100[lianjiao@localhost 7_3_sed]$ seq 100 | awk 'BEGIN{i=0}{i++;sum+=i}END{print sum}' 5050
两个重要选项;OFS和FSOFS:输出域分割符;
FS:设置域分割;
注意$0会全部输出;设置分割符并不会影响结果,要想输出理想结果,$1,$2[lianjiao@localhost 7_3_sed]$ awk 'BEGIN{FS="t";OFS=";"}{print $0}' file productA 50 productB 70 productC 30 productD 80 productE 50 productF 50
[lianjiao@localhost 7_3_sed]$ awk 'BEGIN{FS="t";OFS=";"}{print $1,$2}' file produc;A 50 produc;B 70 produc;C 30 produc;D 80 produc;E 50 produc;F 50