IT之道-艾锑知道

您当前位置: 主页 > 资讯动态 > 艾锑分享 >

IT系统运维:Linux运维三剑客“grep,sed,awk”


2020-04-15 19:52 作者:admin 浏览量:
IT系统运维Linux运维三剑客“grep,sed,awk
 
Linux系统运维中,因为基本都是采用命令行的形式。有几款强大的工具需要掌握,属于系统运维工程师的运维利器,功能非常强大。
一. grep
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
选项
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-h 当搜索多个文件时,不显示匹配文件名前缀
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-n 列出所有的匹配的文本行,并显示行号
-r  递归搜索,搜索当前目录和子目录,此参数的效果和指定“-d recurse”参数相同。
-v 反转查找。只显示不匹配的文本行
 
1. -r递归查找
root@siguorui-OptiPlex-7010:/home/xhprof/trunk# grep -r XHProfRuns_Default *
examples/sample.php:$xhprof_runs = new XHProfRuns_Default();
xhprof_html/callgraph.php:$xhprof_runs_impl = new XHProfRuns_Default();
xhprof_html/typeahead.php:$xhprof_runs_impl = new XHProfRuns_Default();
 
2. -I的使用,显示文件名称
root@siguorui-OptiPlex-7010:~# grep -I root abc.txt 123.txt passwd
passwd:root:x:0:0:root:/root:/bin/bash
 
3. -n
root@siguorui-OptiPlex-7010:~# grep -n 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
 
二.sed
sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
 
命令格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
 
options常用选项
-e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;
-n或--quiet或——silent:仅显示script处理后的结果;
 
command常用
a\ 在当前行下面插入文本。
i\ 在当前行上面插入文本。
c\ 把选定的行改为新的文本。
d 删除,删除选择的行。
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
s 替换指定字符
p 打印模板块的行。
q 退出Sed。
r file 从file中读行。
w file 写并追加模板块到file末尾。  
 
1. p 打印相关的行
nl passwd|sed -n '10p' //打印第10行内容
sed -n 'p' passwd
sed -n '/root/p' passwd //正则匹配打印
nl passwd|sed -n '10,20p' //打印第10行到20行
nl passwd|sed -n '/news/,/nobody/p' //用正则来指定一个行的范围
nl passwd|sed -n '10,20!p'  //不选择10到20行,!代表取反
nl passwd|sed -n '1~2p' //间隔行,会输出1,3,5....行
注意,这里一定要加上-n选项,否则每条数据会显示同样的2行。并且无关的其他内容也会显示出来
 
2. a 在行后面增加内容
root@siguorui-OptiPlex-7010:~# nl passwd|sed '2a **************'
     root:x:0:0:root:/root:/bin/bash
     daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
**************
     bin:x:2:2:bin:/bin:/usr/sbin/nologin
nl passwd|sed '1,2a **************' //在范围内的每一行后面都插入
 
3. i在行前面插入
root@siguorui-OptiPlex-7010:~# nl passwd|sed '1,2i **************'
**************
     root:x:0:0:root:/root:/bin/bash
**************
     daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
 
4. c把选定的行改为新的文本
root@siguorui-OptiPlex-7010:~# nl passwd|sed '1c abcd'
abcd
     daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
 //与a,i不同的时,如果这里是一个行的范围则是把这个范围内容替换为当前内容   
root@siguorui-OptiPlex-7010:~# nl passwd|sed '1,3c abcd'
abcd
     ys:x:3:3:sys:/dev:/usr/sbin/nologin
5. d删除行
root@siguorui-OptiPlex-7010:~# nl passwd | sed '/root/d'
     daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
     bin:x:2:2:bin:/bin:/usr/sbin/nologin
 
三、awk
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。特点是处理灵活,功能强大。可实现统计、制表以及其他功能。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
格式
· 命令行格式
awk [options] 'command' file(s)
· 脚本格式
awk -f awk-script-file file(s)
 
命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
· [-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
' ' 引用代码块
· BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
· // 匹配代码块,可以是字符串或正则表达式
· {} 命令代码块,包含一条或多条命令
· ; 多条命令使用分号分隔
· END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
 
常用内置参数
· 1,$2... 表示整个当前行
· $1 每行第一个字段
· NF 字段数量变量
· NR 每行的记录号,多文件记录递增
· FILENAME 文件名
1. 常用内置参数,2....。通过分隔符指定,按顺序依次为2...。默认分隔符为空格
awk -F ':' '{print "USERNAE:"$1"\t""UID:"$3}' passwd
2. NR,NF,FILENAME
awk -F ':' '{print "Line:"NR,"Col:"NF,"USER:"$1}' passwd
3. 运用printf指定格式来打印
awk -F ':' '{printf("Line:%3s Col:%s User:%s\n",NR,NF,$1)}' passwd
root@siguorui-OptiPlex-7010:~# awk -F ':' '{printf("Line:%3s Col:%s User:%s\n",NR,NF,$1)}' passwd
Line:  1 Col:7 User:root
Line:  2 Col:7 User:daemon
Line:  3 Col:7 User:bin
Line:  4 Col:7 User:sys
...
4. 使用if
awk -F ':' '{if ($3>100) printf("Line:%3s Col:%s User:%s\n",NR,NF,$1)}' passwd
5. 正则和命令结合使用
awk -F ':' '/root/{print $1}' passwd
root@siguorui-OptiPlex-7010:~# awk -F ':' '/root/{print $1}' passwd
root
6. 使用BEGIN和END来制表
awk -F ':' 'BEGIN{print "line  col   user"}{print NR" |"NF" |"$1}END{print "----------------"FILENAME}' passwd
7. 使用BEGIN和END来统计一个目录下文件总计大小
ls -l|awk 'BEGIN{size=0}{size+=$5}END{print " size is "size/1024/1024"M"}'
以上内容由北京艾锑无限科技发展有限公司整理

相关文章

IT外包服务
二维码 关闭