Linux正则表达式和文件格式化处理
Table of Contents
- 1 grep
- 2 sed
- 3 printf (原来还有这个命令)
- 4 awk
- 5 文件对比
1 grep
- cat xxx | grep -n -A3 -B2 'eth' 将xxx文件中包含eth的行,以及它前面的两行,后面的三行都显示出来,并显示行号
- 搜索特定字符串
- grep -n 'the' filename
- 搜索filename中 含有 the的行,并显示行号
- grep -vn 'the' filename
- 搜索filename中 不含 the的行,并显示行号
- grep -in 'the' filename
- 搜索filename中含有the的行,并显示行号, 不区别大小写
- grep -n 'the' filename
- 搜索相似字符串
- grep -n 't[ae]st' filename
- 搜索含有tast 或者 test的行
- grep -n '[^g]oo' filename
- 搜索含有oo 且 oo前面 不含有 g的行
- grep -n '[^a-z]oo' filename
- 搜索含有oo 且 oo前面 不含有 小写字母的行
- grep -n '[0-9]' filename
- 搜索 含有数字 的行
- grep -n 't[ae]st' filename
- 搜索行首行尾
- grep -n '^the' filename
- 搜索 行首 出现the的行
- grep -n '^[a-z]' filename
- 搜索 行首 是小写字母 的行
- grep -n '^[^a-zA-Z]' filename
- 搜索 行首 不是字母 的行
- grep -n '\.$' filename
- 搜索行尾是.的行
- grep -n '^$' filename
- 搜索空行
- 由此可以理解^代表行首之前,$代表行尾之后,^$即代表行首行尾间什么都没有,即空行
- grep -n '^the' filename
- 任意一个字符.与任意个字符*
- grep -n 'g..d' filename
- 搜索有g??d模式的行,g..d有且仅有四个字符
- grep -n 'ooo*' filename
- 搜索有两个以上o的行,即前两个o一定存在,最后一个o*表示0到n个o, 千万注意这里的*与通配符里*的不同
- grep -n 'g.*d' filename
- 搜索有g开始,d结尾,中间任意个字符的字符串的行
- grep -n 'g..d' filename
- 限定连续字符个数
- grep -n 'o\{2\}' filename
- 搜索含有两个o字符串的行
- grep -n 'go\{2,5\}g' filename
- 搜索含有开头g,结尾g,中间2到5个o的字符串的行
- grep -n 'go\{2,\}g' filename
- 搜索含有开头g,结尾g,中间2个以上o的字符串的行
- grep -n 'o\{2\}' filename
2 sed
- 增删换显
- nl filename | sed '2,5d'
- 列出filename每一行,并加行号,然后删除2到5行,
- 删除第2行: '2d'
- 删除第2行到最后一行: '2,$d'
- nl filename | sed '2i this is a new line'
- 在第2行后增加新行,内容是"this is new line"
- nl filename | sed '2a this is new line one \ > this is new line two'
- nl filename | sed '2,5c this is a replace line'
- 将2到5行替换为"this is a replace line"
- nl filename | sed -n '3,5p'
- 打印3到5行
- nl filename | sed '2,5d'
3 printf (原来还有这个命令)
- printf '%s\t%s\t%s\n' $(cat filename)
- printf '%10s %5i %8.2f\n' $(cat filename)
4 awk
awk '条件类型1{动作1} 条件类型2{动作2}' filename
- cat filename | awk '{print $1 "\t" $3}'
- 每一行都要处理,因此无条件类型,动作即为打印第1列,第3列,中间以Tab分隔
- cat filename | awk '{print $1 "\t lines:" NR "\t columns:" NF}'
- NR:行数,NF,列数
- cat filename | awk 'BEGIN{FS=":"} $3 < 10 {print $1 "\t" $3}'
- FS是指分割符,$3 < 10是条件,{}内是动作
5 文件对比
- diff