一、grep:文本搜索工具
-c 只输出匹配的行数
-i 不区分大小写
-v 过滤掉包含指定字符串的行
-s 不显示不存在或无匹配的文本的错误信息
-w 只显示匹配的整个单词,而不是字符串的一部分
-n 显示匹配行及行号
-l 只列出匹配的文件名
-L 列出不匹配的文件名
例:
grep -c root /etc/passwd 如果包含root字符串在文件中有两行,显示为2
grep -i root /etc/passwd 显示出root字符串的行,包含其大小写
grep -v root /etc/passwd 显示除含有root字符串的行
grep ‘test’ d* 显示所有以d开头的文件中包含test字符串的行
grep ‘^$‘ /etc/passwd 显示passwd文件中的空行
grep ‘test‘ aa bb cc 显示在aa,bb,cc文件中匹配test的行
正则表达式的主要参数:
\ 忽略正则表达式中特殊字符的原有含义
[] 单个字符,如[a]即[a]符合要求
[-] 范围,如[a-z],即a,b,c一直到z都符合要求
grep ‘[a-z]\{5\}‘ aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行,a-z都可以
grep ‘w\(es\)t.*\1‘ aa 如果west被匹配,则es被存储到内存中,并标记为1,然后搜索任意个字符(.*), 这些字符后面紧跟着另外一个es(\1),找到就显示该行。例:west.es west.esdd.es west.aa.es
grep test /mnt/* 目录下搜索带字符串test的文件
grep -l test /mnt/* 只列出匹配的文件名
grep -L test /mnt/* 列出不匹配的文件名
[[:alpha:]] 单个字母
[[:lower:]] 单个小写字母
[[:upper:]] 单个大写字母
[[:alnum:]] 单个字母或数字
[[:punct:]] 单个符号,不包含数字,字母以及空格
[[:digit:]] 数字
[[:space:]] 空格
例:grep ‘5[[:upper:]][[:upper:]]‘ aa 显示以5开头以两个大写字母结尾的行
二、sed:文本处理工具
-u 展示修改后的文本内容,但不是真的改
-i 直接修改文件,不显示内容
sed ‘1d‘ file 删除第一行
sed ‘2,$d‘ file 删除第二行到最后一行
sed ‘1a play lol‘ file 第一行后面增加字符串"play lol"
sed ‘5i go die‘ file 在第5行前添加"go die"
sed ‘1c Hi‘ file 第一行代替为Hi
sed -n 2,‘$‘p file 显示第二行到最后一行
sed ‘s/^.*asd.*$/lizekang/g‘ file 匹配asd字符,并修改整行为lizekang
sed ‘14c [file]‘ file 修改14行整行为[file]
sed -n ‘/^\//p‘ file 显示以/开头的行(如果没有-n选项,则显示file中的所有内容和/开头的行两份,-n模式将其他行过滤掉,只显示/开头的行)
sed ‘/^$/d‘ fiel 删除文件中的空白行
sed ‘/^#/d‘ file 删除文件开头的#号
sed ‘s/^[[:spqce:]]*//g‘ fiel 删除文件行首的空格
三、awk:文本分析工具
-F(分割词):不添加此参数默认以空格分割。
‘{print $1}‘ :必要字段,输出具体第几段,$NF表示最后一个元素。
awk ‘{print NR,$0}‘ 在每行前面加上行号。
awk ‘{if (NR<=3+1 && NR>=2) print $0}‘ 输出第二行到第四行。
netstat -an|awk ‘/^tcp/ {++state[$NF]} END {for(i in state) print i,"\t",state[i]}‘
/^tcp/ 滤出tcp开头的记录,屏蔽udp,socket等无关记录。
state[] 相当于定义一个叫state的数组
NF 表示记录的字段数
state[$NF] 表示数组元素的值,如上就是state[TIME_WAIT]的连接数
++state[$NF] 上面的连接数加1
下面是awk的一些练习:
1. 用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt);
awk ‘{print $0}‘ test.txt
2. 查找所有包含’bash’的行;
awk ‘/bash/‘ test.txt
3. 用’:’作为分隔符,查找第三段等于0的行;
awk -F ‘:‘ ‘$3=="0"‘ test.txt
4. 用’:’作为分隔符,查找第一段为’root’的行,并把该段的’root’换成’toor’(可以连同sed一起使用);
awk -F ‘:‘ ‘$1=="root"‘ test.txt | sed ‘s/root/root/g‘
5. 用’:’作为分隔符,打印最后一段;
awk -F ‘:‘ ‘{print $NF}‘ text.txt
6. 打印行数大于20的所有行;
awk -F ‘:‘ ‘NR>20‘ test.txt
7. 用’:’作为分隔符,打印所有第三段小于第四段的行;
awk -F ‘:‘ ‘$3<$4‘ test.txt
8. 用’:’作为分隔符,打印第一段以及最后一段,并且中间用’@’连接 (例如,第一行应该是这样的形式 “[email protected]/bin/bash”;
awk -F ‘:‘ ‘{print $1"@"$NF}‘ test.txt
9. 用’:’作为分隔符,把整个文档的第四段相加,求和;
awk -F ‘:‘ ‘{(sum+=$4)}; END {print sum}‘ test.txt