Linux三剑客Awk命令详解
命令名称
Awk pattern scanning and processing language
命令作用
对文本和数据进行解决
具体阐明
awk 是一种编程语言,用于在linux/unix下对文本和数据进行解决。数据能够来自规范输(stdin)、一个或多个文件,或其它命令的输入。它在命令行中应用,但更多是作为脚本来应用。awk有很多内建的性能,比方数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的劣势。
语法格局
awk [options] 'scripts' var=value filename
罕用参数
- -F 指定分隔符(能够是字符串或正则表达式)
- -f 从脚本文件中读取awk命令
- -v var=value 赋值变量,将内部变量传递给awk
脚本根本构造
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' filename
一个awk脚本通常由BEGIN语句+模式匹配+END语句三局部组成,这三局部都是可选项
工作原理:
- 第一步执行BEGIN 语句
- 第二步从文件或规范输出读取一行,而后再执行pattern语句,逐行扫描文件到文件全副被读取
- 第三步执行END语句
实例展现:
echo "hello " | awk 'BEGIN{ print "welcome" } END{ print "2017-08-08" }'welcome2017-08-08echo -e "hello" | awk 'BEGIN{ print "welcome" } {print} END{ print "2017-08-08" }'welcomehello2017-08-08#不加print参数时默认只打印以后的行echo|awk '{ a="hello"; b="nihao"; c="mingongge"; print a,b,c; }'hello nihao mingongge#应用print以逗号分隔时,打印则是以空格分界echo|awk '{ a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c; }'mgg is mingg or mingongge#awk的print语句中双引号其实就是个拼接作用
Awk的变量
内置变量
$0 #以后记录$1~$n #以后记录的第N个字段FS #输出字段分隔符(-F雷同作用)默认空格RS #输出记录宰割符,默认换行符NF #字段个数就是列NR #记录数,就是行号,默认从1开始OFS #输入字段分隔符,默认空格ORS #输入记录宰割符,默认换行符
内部变量
[mingongge@ ~]#a=100[mingongge@ ~]#b=100[mingongge@ ~]#echo |awk '{print v1*v2 }' v1=$a v2=$b10000
Awk运算与判断
算术运算符
- 加减
- / & 乘 除 求余
- ^ * 求幂
- ++ -- 减少或缩小,作为前缀或后缀
[mingongge@ ~]#awk 'BEGIN{a="b";print a,a++,a--,++a;}'b 0 1 1[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,a--,++a;}'0 0 1 1[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,--a,++a;}'0 0 0 1#和其它编程语言一样,所有用作算术运算符进行操作,操作数主动转为数值,所有非数值都变为0
赋值运算符
= += -= *= /= %= ^= **=
正则运算符
~ !~ 匹配正则表达式/不匹配正则表达式
逻辑运算符
|| && 逻辑或 逻辑与
关系运算符
< <= > >= != =
其它运算符
$ #字段援用 空格 #字符串链接符?: #三目运算符ln #数组中是否存在某键值
Awk正则
^ 行首定位符$ 行尾定位符. 匹配任意单个字符* 匹配0个或多个前导字符(包含回车)+ 匹配1个或多个前导字符? 匹配0个或1个前导字符 [] 匹配指定字符组内的任意一个字符/^[ab][^] 匹配不在指定字符组内的任意一个字符() 子表达式| 或者\ 本义符~,!~ 匹配或不匹配的条件语句x{m} x字符反复m次x{m,} x字符至多反复m次X{m,n} x字符至多反复m次但不起过n次(需指定参数-posix或--re-interval)
Linux三剑客Sed命令详解
命令名称
Sed 一个弱小的流式文本编辑器
具体阐明
sed是一种流编辑器,也是文本处理中十分好的工具,配合正则应用更弱小解决时,把以后解决的行存储在长期缓冲区中,称为“模式空间”,接着用sed命令解决缓冲区的内容,实现后输入到屏幕,接着解决下一行.
命令格局
sed [options] 'command' file(s) sed [options] -f scriptfile file(s)
罕用参数
-e #以指定的指令来解决输出的文本文件-n #勾销默认输入(如果和p命令同时应用只会打印产生扭转的行**)-h #帮忙-V #显示版本信息
常用命令
a #在以后行上面插入文本 i #在以后行下面插入文本 c #把选定的行改为新的文本 d #删除,删除抉择的行 D #删除模板块的第一行 s #替换指定字符 h #拷贝模板块的内容到内存中的缓冲区H #追加模板块的内容到内存中的缓冲区 g #取得内存缓冲区的内容,并代替以后模板块中的文本 G #取得内存缓冲区的内容,并追加到以后模板块文本的前面 l #列表不能打印字符的清单 n #读取下一个输出行,用下一个命令解决新的行而不是用第一个命令 N #追加下一个输出行到模板块前面并在二者间嵌入一个新行,扭转以后行号码 p #打印匹配的行 P #(大写)打印模板的第一行q #退出Sed b #lable 分支到脚本中带有标记的中央,如果分支不存在则分支到脚本的开端 r #file 从file中读行 t #label if分支,从最初一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的开端 T #label 谬误分支,从最初一行开始,一旦产生谬误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的开端 w #file 写并追加模板块到file开端W #file 写并追加模板块的第一行到file开端! #示意前面的命令对所有没有被选定的行产生作用 = #打印以后行号码# #把正文扩大到下一个换行符以前
Sed替换命令
g #示意行内全面替换(全局替换配合s命令应用)p #示意打印行 w #示意把行写入一个文件 x #示意调换模板块中的文本和缓冲区中的文本 y #示意把一个字符翻译为另外的字符(然而不用于正则表达式) 1 #子串匹配标记 & #已匹配字符串标记
Sed正则
^ #匹配行开始 $ #匹配行完结. #匹配一个非换行符的任意字符 #匹配0个或多个字符[] #匹配一个指定范畴内的字符[^] #匹配一个不在指定范畴内的字符 (..) #匹配子串& #保留搜寻字符用来替换其余字符< #匹配单词的开始> #匹配单词的完结x{m} #反复字符x,m次x{m,} #反复字符x,至多m次 x{m,n} #反复字符x,至多m次,不多于n次
Sed罕用实例
1、替换操作
echo "hello world" |sed 's/ /-/1g'hello-world #从第一个空格开始全局替换成-,只不过文本中只有一个空格
2、删除操作
sed '/^$/d' filename #删除空白行sed '2d' filename #删除第二行sed '2,$d' filename #删除第二直到未尾所有行sed '$d' filename #删除最初一行sed '/^test/'d filename #删除以test结尾行
3、匹配替换
echo "hello world" |sed 's/w+/[&]/g'[hello] [world]echo "hello world" |sed 's/w+/"&"/g'"hello" "world"#w+匹配每一个单词,&示意匹配到的字符串echo AAA bbb |sed 's/([A-Z]+) ([a-z]+)/[2] [1]/'[bbb] [AAA]#子串匹配替换
4、选定范畴
sed -n '/= 0/,/max/p' svnserve.conf#min-encryption = 0#max-encryption = 256#所有在=0到max范畴内的行都会被打印进去
5、sed多点编辑性能(-e)
[root@centos001 ~]#cat -n test 1 this is a test file2 welcome3 to4 here5 hello WORLD67 linux centos6.88 redhatsed -e '2,6d' -e 's/linux centos6.8/Linux Centos6.8/' testthis is a test fileLinux Centos6.8redhat#如果两条命令性能一样,那么就须要用到上面的参数sed --expression='s/linux centos6.8/Linux Centos6.8/' --expression='s/to/TO/' test**this is a test filewelcomeTOherehello WORLDLinux CenTOs6.8redhat
6、读入与写入
[root@centos001 ~]#cat test1welcom to here[root@centos001 ~]#sed '/here/r test1' testthis is a test filewelcometohere#welcomtohere#hello WORLDlinux centos6.8redhat#将test1的文件内容读取显示所有匹配here行的前面sed -n '/centos6.8/w test2' test[root@centos001 ~]#cat test2linux centos6.8#将test文件匹配到centos6.8的所有行都写入到test2文件中,文件能够不存在.#如果文件存在,就会被重定向不是追加
7、追加与插入
[root@centos001 ~]#sed '/^l/a2017-08-08' test2linux centos6.82017-08-08#在匹配以l结尾的行的前面追加2017-08-08[root@centos001 ~]#sed '1a2017-08-08' test2linux centos6.82017-08-08#在第一行的前面追加2017-08-08[root@centos001 ~]#sed '/^l/i2017-08-08' test22017-08-08linux centos6.8#在匹配以l结尾的行的后面插入2017-08-08#######以上操作是不会扭转文件内容################[root@centos001 ~]#sed -i '/^l/i2017-08-08' test2[root@centos001 ~]#cat test22017-08-08linux centos6.8
8、其它命令实例
[root@centos001 ~]#cat -n test2 1 2017-08-08 2 linux centos6.8 3 08 4 5 test[root@centos001 ~]#**sed '/08/{ n; s/l/L/; }' test22017-08-08Linux centos6.808test#如果08匹配到就跳到下一行,将小写l替换成大写,留神到第三行也是被匹配到#然而前面的条件不满足,所有没有被替换[root@centos001 ~]#sed '1,4y/8/9/' test22017-09-09linux centos6.909test#将1至4行所有的数字8替换成9[root@centos001 ~]#**sed '1q' test2**2017-08-08#打印第一行内容后退出
9、打印奇数或公偶数行
[root@centos001 ~]#sed -n 'p;n' test22017080808[root@centos001 ~]#sed -n 'n;p' test2linux centos6.8test[root@centos001 ~]#sed -n '1~2p' test22017080808[root@centos001 ~]#sed -n '2~2p' test2linux centos6.8test
10、打印匹配字符串行的下一行
[root@centos001 ~]#sed -n '/linux/{n;p}' test208[root@centos001 ~]#awk '/linux/{getline; print}' test208
Linux三剑客Grep 命令详解
命令名称:
grep
命令作用:
文本查找或搜寻工具
具体阐明:
同样能够配合正则表达式来搜寻文本,并将匹配的行打印输出,也可用于过滤与搜寻特定字符串,应用非常灵便
罕用参数:
-a #不要疏忽二进制数据-A #除了显示合乎范本款式的那一行之外,并显示该行之后的内容-b #在显示合乎范本款式的那一行之外,并显示该行之前的内容-B #除了显示合乎款式的那一行之外,并显示该行之前的内容-c #计算合乎范本款式的列数-C #除了显示合乎范本款式的那一列之外,并显示该列之前后的内容-d #当指定要查找的是目录而非文件时,必须应用这项参数,否则grep命令将回报信息并进行动作-e #指定字符串作为查找文件内容的范本款式-E #将范本款式为延长的一般表示法来应用,意味着应用能应用扩大正则表达式-f #指定范本文件,其内容有一个或多个范本款式,让grep查找合乎范本条件的文件内容,格局为每一列的范本款式-F #将范本款式视为固定字符串的列表-G #将范本款式视为一般的表示法来应用-h #在显示合乎范本款式的那一列之前,不标示该列所属的文件名称-H #在显示合乎范本款式的那一列之前,标示该列的文件名称-i #疏忽字符大小写的差异-l #列出文件内容合乎指定的范本款式的文件名称-L #列出文件内容不合乎指定的范本款式的文件名称-n #在显示合乎范本款式的那一列之前,标示出该列的编号-q #不显示任何信息-R/-r #此参数的成果和指定“-d recurse”参数雷同-s #不显示错误信息-v #反转查找-V #显示版本信息 -w #只显示全字合乎的列-x #只显示全列合乎的列-y #此参数成果跟“-i”雷同-o #只输入文件中匹配到的局部
正则表达式
^ #匹配以XX结尾的行$ #匹配以XX结尾的行
罕用实例:
1、在多个文件中查找:
grep "file" file_1 file_2 file_3
2、输入除之外的所有行 -v 选项:
grep -v "file" file_name
3、标记匹配色彩 --color=auto 选项:
grep "file" file_name --color=auto
4、应用正则表达式 -E 选项:
grep -E "[1-9]+"egrep "[1-9]+"
5、只输入文件中匹配到的局部 -o 选项:
echo this is a test line. | grep -o -E "[a-z]+."line.echo this is a test line. | egrep -o "[a-z]+."line.
6、统计文件或者文本中蕴含匹配字符串的行数-c 选项:
grep -c "text" file_name2
7、输入蕴含匹配字符串的行数 -n 选项:
grep "text" -n file_name或cat file_name | grep "text" -n
8、多个文件
grep "text" -n file_1 file_2
9、搜寻多个文件并查找匹配文本在哪些文件中:
grep -l "text" file1 file2 file3...
10、grep递归搜寻文件
在多级目录中对文本进行递归搜寻:
grep "text" . -r -n
11、疏忽匹配款式中的字符大小写:
echo "hello world" | grep -i "HELLO"hello
12、选项 -e 指定多个匹配款式:
echo this is a text line | grep -e "is" -e "line" -oisline
13、也能够应用 -f 选项来匹配多个款式,在款式文件中逐行写出须要匹配的字符。
cat patfileaaabbbecho aaa bbb ccc ddd eee | grep -f patfile -o
14、在grep搜寻后果中包含或者排除指定文件:
只在目录中所有的.php和.html文件中递归搜寻字符"main()"
grep "main()" . -r --include *.{php,html}
15、在搜寻后果中排除所有README文件
grep "main()" . -r --exclude "README"
16、在搜寻后果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist
Linux三剑客Awk、Sed、Grep 命令详解,到这里就介绍完了。欢送评论、点赞、转发分享反对。