首页 > 代码库 > LinuxShell脚本攻略--第四章 让文本飞

LinuxShell脚本攻略--第四章 让文本飞

 

grep

$ grep pattern filename    #搜索filename下的包含pattern的行
$ grep "pattern" filename
$ grep -E "[a-z]+" filename  #正则匹配添加参数-E或者下面的egrep
$ egrep "[a-z]+" filename
$ echo this is a line. | egrep -o "[a-z]+\."  #只输出匹配的文本部分 -o
line.
$ grep -v match_pattern file  #打印包含match_pattern行之外的所有行 -v(invert)
$ grep -c "text" filename   #打印包含匹配字符串的行的数量

上面只是显示的匹配的行的数量并不是匹配的次数,想获取匹配项的数量,可以使用下面的技巧

$ echo -e "1 2 3 4\nhello\n5 6" | egrep -o "[0-9]" | wc -l
6
#打印包含匹配字符串的行号
$ cat sample1.txt gnu is not unix linux is fun bash is art
$
grep linux -n sample1.txt      #-n打印匹配的行号
2:linux is fun
$ cat sample1.txt | grep linux -n
#打印模式匹配所位于的字符或字节偏移
$ echo gnu is not unix | grep -b -o "not"
7:not

-b 和-o 总是配合使用。

#搜索多个文件并找出匹配文本位于哪一个文件中
$ grep -l linux sample1.txt sample2.txt  #-l找出匹配的文本列表
sample1.txt
sample2.txt

和-l 相反的选项是-L ,它会返回一个不匹配的文件列表。

#递归搜索文件
$ grep -i "text" . -R -n        #-R 递归搜索,-n打印行号,-i不考虑大小写

#用 grep 匹配多个样式
$ echo this is a line of text | grep -e "this" -e "line" -o #-e指定多个匹配样式
this
line

#在 grep 搜索中指定或排除文件
#目录中递归搜索所有的 .c和 .cpp文件
$ grep "main()" . -r --include *.{c,cpp} #--include查找符合规则的文件 *.{c,cpp}会扩展成 *.c *.cpp
#搜索中排除所有的 README 文件
$ grep "main()" . -r --exclude "README"   #排除README文件,如果是文件夹--exclude-dir。如果是文件列表,使用 --exclude-from FILE 。

#使用0值字节作为后缀的 grep 与 xargs
#-Z输出以0值作为终结符的文件名(\0),xargs -0读取输入并用0值字节终结符分隔文件名.
$ grep "test" file* -lZ | xargs -0 rm    #-Z 通常和 -l 结合使用

$ seq 10 | grep 5 -A        #要打印匹配某个结果之后的3行,使用 -A 选项
$ seq 10 | grep 5 -B 3       #要打印匹配某个结果之前的3行,使用 -B 选项
$ seq 10 | grep 5 -C 3       #要打印匹配某个结果之前以及之后的3行,使用 -C 选项

sed

 

LinuxShell脚本攻略--第四章 让文本飞