一、流编辑器 sed
选项 |
-e |
连接多个编辑命令(直接在命令行模式上进行sed的操作) |
-f |
指定sed脚本文件名(将sed的操作写在一个文件里,用的时候 -f filename 就可以按照内容进行sed操作了) |
|
-n |
阻止输入行自动输出(只有经过sed处理过的行才显示出来,其他不显示) |
-r 使之支持扩展正则表达式
sed ‘3q’ test.in
sed ‘s/public/PUBLIC/’ test.in
sed -n ‘s/public/PUBLIC/p’ test.in
1、用分号分隔命令
sed ‘s/public/PUBLIC/;s/north/NORTH/‘ test.in
2、每个命令前放置-e
sed -e ‘s/public/PUBLIC/‘ -e ‘s/north/NORTH/‘ test.in
3、使用分行命令功能,在输入单引号后按return键就会出现多行提示符(>)
sed ‘
> s/public/PUBLIC/
> s/north/NORTH/‘ test.in
在脚本中使用sed命令:
test.sed文件内容如下:
s/public/PUBLIC/
s/north/NORTH/
sed -f test.sed test.in
n |
表示第 n 行 |
|
$ |
表示最后一行 |
|
m,n |
表示从第 m 行到第 n 行 |
|
/pattern/ |
查询包含指定模式的行。如 /disk/、/[a-z]/ |
|
/pattern/,n |
表示从包含指定模式的行 到 第 n 行 |
|
n,/pattern/ |
表示从第 n 行 到 包含指定模式的行 |
|
/模式1/,/模式2/ |
表示从包含模式1 到 包含模式2的行 |
|
! |
反向选择,如 m,n!的结果与m,n 相反 |
sed ‘3q‘ test.in
p |
打印匹配行 |
s |
替换命令 |
= |
显示匹配行的行号 |
l |
显示指定行中所有字符 |
d |
删除匹配的行 |
r |
读文件 |
a\ |
在指定行后面追加文本 |
w |
写文件 |
i\ |
在指定行前面追加文本 |
n |
读取指定行的下面一行 |
c\ |
用新文本替换指定的行 |
q |
退出 sed |
awk 逐行扫描输入 (可以是文件或管道等),按给定的模式查找出匹配的行,然后对这些行执行awk 命令指定的操作。
可以使用重定向将awk的输出保存到文件中。
用法示 |
||
选项 |
-F |
指定输入记录字段的分隔符,默认使用环境变量IFS的值 |
-f |
从指定文件读取awk_script |
|
-v |
为awk设定变量 |
awk -F: ‘{ print $1 }‘ /etc/passwd
awk -F: ‘{ print $1, $3 }‘ /etc/passwd // 输出以空格连接
awk -F: ‘{ print $1 "|" $3 }‘ /etc/passwd // 输出以 | 连接
awk -F: ‘/root/{ print $1 "|" $3 }‘ /etc/passwd
awk -F: ‘/^root/‘ /etc/passwd // 开头不是root 的行
(二)awk_script语法
注意BEGIN和END都是大写字母
awk ‘BEGIN {actions}
/pattern1/{actions}
......
/patternN/{actions}
END {actions}‘ input_file
其中BEGIN{actions}和 END{actions}是可选的
取出ip 地址:
ifconfig |awk ‘/inetaddr/{ print $2 }‘ |awk -F: ‘{ print $2 }‘
ifconfig |awk ‘/inetaddr/{ print $2 }‘ |awk -F: ‘BEGIN { print "begin..."} { print $2 } END { print "end..."} ‘
(四)模式匹配
① 使用正则表达式:/rexp/,如/^A/、/A[0-9]*/
^ |
只匹配行首 ( 可以看成是行首的标志 ) |
$ |
只匹配行尾 ( 可以看成是行尾的标志 ) |
* |
一个单字符后紧跟 *,匹配 0个或多个此字符 |
[ ] |
匹配 [] 内的任意一个字符 ([^]反向匹配 ) |
\ |
用来屏蔽一个元字符的特殊含义 |
. |
匹配任意单个字符 |
str1|str2 |
匹配 str1 或 str2 |
+ |
匹配一个或多个前一字符 |
? |
匹配零个或一个前一字符 |
( ) |
字符组 |
(五)字段分隔符、重定向和管道
NR表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,
NR可以理解为Number of Record的缩写。
在awk处理多个输入文件的时候,在处理完第一个文件后,NR并不会从1开始,而是继续累加,因此就出现了FNR,
每当处理一个新文件的时候,FNR就从1开始计数,FNR可以理解为File Number of Record。
NF表示目前的记录被分割的字段的数目,NF可以理解为Number of Field。
(六)更多awk
awk不仅是一个命令,它更是一个编程语言
变量
内部变量
awk ‘ {print NR,$0} ‘ #给文件加上行号
自定变量
函数
内置函数
自定义函数
awk ‘{ print sum($1,$2) } function sum(x,y) { s=x+y ; return s }‘ grade.txt
数组
awk ‘BEGIN { print split("123#456",arr,"#") ; for (i in arr) { print arr[i] } }‘ // arr: 123 456
参考:
《鸟哥的Linux私房菜基础篇》
《高级bash shell编程指南》