sed
sed是文本处理中非常好的工具。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等。
sed的命令格式:
sed [options] ‘command’ file(s)
options(常见选项)
-i :直接修改文件内容; (谨慎使用)
-n :只打印模式匹配的行;
-r :支持扩展表达式;
command(常见命令)
a\ 在当前行下面插入文本;
i\ 在当前行上面插入文本;
c\ 把选定的行改为新的文本;
d 删除,删除选择的行;
s 替换指定字符;
sed替换标记
g 表示行内全面替换;
sed元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行;
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行;
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行;
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed;
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers;
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**;
\< 匹配单词的开始,如:/\
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行;
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行;
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行;
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行;
awk
常见格式:
awk [options] ‘BEGIN{ commands } pattern{ commands } END{ commands }’ filename
常见的命令参数:
-F 指定输入分隔符, 如 -F:
-v 赋值一个用户定义变量,将外部变量传递给awk 。 如 -v name=lisi
-f scripfile 从脚本文件中读取awk命令 (很少使用)
结构体用法:(单引号里面的内容)
1、首先执行 BEGIN内的语句块,只会执行一次,经常用于变量初始化。
2、从文件内容中读取一行,注意awk是以行为单位处理的,每读取一行使用 pattern{commands} 循环处理 可以理解成一个for循环,这也是最重要的部分;其中 pattern 部分就是能帮我们匹配或者过滤掉一些信息
3、最后执行 END ,也是执行一次,在所有行处理完后执行,一帮用于打印一些统计结果。
pattern常见用法:
1、/正则表达式/:使用通配符的扩展集。 例如匹配包含aaa的行, /aaa/
2、关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 例如匹配 第二列值为aaa的行 $2==“aaa”
3、模式匹配表达式:用运算符(匹配)和!(不匹配)。
1、统计 匹配指定行指定列的数之和
[root@gitlab ~]# cat guide-table
lisi 数学 80
lisi 英语 100
lisi 语文 80
zhangsan 数学 90
zhangsan 英语 60
zhangsan 语文 100
wangwu 语文 90
1、求出语文成绩高于90分的人数
awk -v 'course=语文' 'BEGIN{sum=0} $2=="语文" && $3>=90 { sum++ } END{print course" 分数大于90的人数为:"sum }' guide-table
这个例子能搞懂,基本上awk没问题了
2、查找使用了/data目录的进程
lsof | awk '{ if ($9 ~ /^\/data/) { print } }' |awk '{print $2}'
3、查找ext4类型的文件系统挂载信息
df -Th | awk '{if($2=="ext4") {print $0} }' // $0是一个特殊的变量,表示整个输入行的内容。它包含了当前处理行的所有列数据
grep
个人认为是三剑客中最简单的,所以后面更新