linux脚本攻略笔记-grep的相关知识总结

命令grep


在文件中搜索指定的文本,以便在终端查看需要的内容,grep是一个强大的文本处理工具,提供了非常多的选项和功能,并通过和其他工具的结合可以达到更加强大的功能。通过和正则表达式的组合,可以实现非常多的功能。



格式:

grep match_patten filename 


在匹配显示时,高亮显示

grep match_patten filename --color


从studin中搜索

echo 'xxx' | grep 'xxx'


使用正则表达式的匹配

grep -E "[a-z]+"

# echo "this ia a page." | grep -E "[a-z]+\."
this ia a page.

egrep "[a-z]+"

# echo "this ia a page." | egrep "[a-z]+\."
this ia a page.

只显示匹配到的行-o

# echo "this ia a page." | grep -o -E "[a-z]+\."
page.
# echo "this ia a page." | egrep -o "[a-z]+\."
page.


将没有匹配到的行显示出来-v:invert(反转)

# cat test.txt 
apple
block
count
this
#显示以a开头的文件
# cat test.txt | grep -E "^a"
apple
#显示不以a开头的文件
# cat test.txt | grep -E -v "^a"
block
count
this


统计匹配到的行数-c:count,匹配行的数量,而不是匹配到的次数

# cat test.txt 
apple
apple
block
count
this
# cat test.txt | grep -E -c "^a"
2

统计匹配到的次数,通过管道输出给wc -l

# echo -e "1 2 3 4\nhello\n5 6 7" | grep -e "[0-9]"
1 2 3 4
5 6 7
# echo -e "1 2 3 4\nhello\n5 6 7" | grep -e "[0-9]" | wc -l
2
# echo -e "1 2 3 4\nhello\n5 6 7" | grep -e "[0-9]" | wc -c
14

打印出匹配到的行的行号

# cat test1.txt 
help
orange
this
# grep -n orange test1.txt 
2:orange


从多个文件中匹配

# grep -n this test1.txt test.txt 
test1.txt:3:this
test.txt:5:this

打印出字符的偏移:-b,总是和-o一起使用

# echo this is a page. | grep -b -o "a" 
8:a
11:a

从多个文件中找出匹配的文本属于哪个文件 -l word

# grep -l this test1.txt test.txt 
test1.txt
test.txt


grep的其他选项


递归搜索文件:-R


忽略样式的大小写:-i

# grep -i count  test.txt 
count
COUNT


指定多个样式进行匹配,其他的选项放在所有-e 'word'的后面

# cat test.txt 
apple
apple
block
count
this
COUNT
# grep -e "apple" -e "count" -i test.txt 
apple
apple
count
COUNT

指定一个样式文件进行匹配,-f:其他选项放在样式文件之后

grep -f patten_file source_file

#样式文件
# cat patten 
apple
count
# grep -f patten -i test.txt 
apple
apple
count
COUNT


在当前目录下搜索包含特定字符的文件

# grep "this" . -r --include *.txt
./test1.txt:this
test.txt:this


在当前目录下搜索出特定文件之外的其他文件是否包含匹配的字符(也就是说,在搜索时,不搜索.txt结尾的文件)

# grep -e "this" . -r --exclude


grep脚本实现正则匹配

#!/bin/bash
#
if [ $# -ne 2 ];then
        echo "$0 patten_match filename";
fi
match=$1
filename=$2
grep $match $filename
if [ $? -ne 0 ];then
        echo 'grep failed'
else
        echo 'grep successful'
fi


匹配某个结果之后的3行

# seq 10 | grep 5 -A 3
5
6
7
8


匹配某个结果之前的3行

# seq 10 | grep 5 -B 3
2
3
4
5

匹配某个结果之前之后的3行

# seq 10 | grep 5 -C 3
2
3
4
5
6
7
8


以一个定界符进行分割,匹配到的重复的行

echo -e "a\nb\nc\nd\nf\na\nb\a" | grep a -A 1
a
b
--
a
b


你可能感兴趣的:(grep,grep相关,linux脚本攻略)