grep用法小例:
示例数据存在ipaddr文件中,如下:
i8.208.102.12
80
中国 阿里云
高匿名
0.5ms
2021-03-13 18:40:19
8.133.191.41
8080
中国 阿里云
高匿名
命令举例如下: 必须用单引号''或者双引号""把grep的查询模式引起来,而且其中{}必须转意成\{ \}
cat ipaddr | grep "[0-9]\{4\}" 找出有4位数字的行
找出所有IP地址:注意:{} . () 都需要加“\”进行转意
结合awk命令的用法:
cat ipaddr | grep "2021-03-10" |awk '{FS="i"} {print $2}'
结果如下:(第一行有问题)
17:26:52i8.208.102.12
8.208.102.12
8.208.102.12
8.208.102.12
8.208.102.12
8.208.102.12
8.208.102.12
8.208.102.12
8.208.102.12
解决办法:在动作语句中加BEGIN
cat ipaddr | grep "2021-03-10" |awk 'BEGIN{FS="i"} {print $2}'
综合多种材料,详解linux的正则表达式
正则表达式的基础:
语系对正则是有影响的
grep 命令
grep [-A][-B] [--color=auto] '搜索字符串' filename
dmesg 列出核心信息
搜索指定文本grep -n 'the' filename
利用[]搜索集合字符:grep -n 't[ae]st' filename []里,不论有几个字符,只匹配一个
集合字符反向选择:[^]:grep -n '[^g]oo' filename
字符连续编码有两种方式:
grep -n '[^a-z]oo' filename
grep -n '[^[:lower:]]oo' filename
行首与行尾字符:^$
以the开头的查找:grep -n '^the' filename
不以英文字母开头的:grep -n '^[^a-zA-Z]' filenamen 或grep -n '^[^[:alpha:]]' filename
以.结尾的查询:grep -n '\.$' filename
注意:有时一些行没有选中,这时通过cat -An 命令查看文件,观察结尾是否真的是以.$结束的。
去掉注释行和空行:grep -v '^$' filename | grep -v '^#'
任意字符. 和重复字符*
grep -n 'o*' filename 想一想,为什么会打出所有行?
限定连续字符范围{}
注意:{}是特殊字符,用在正则表达式时,要用\转义
grep -n 'o\{2\}' filename 找o出现2次的行
grep -n 'o\{2,5\}' filename 找o出现2到5次的行
正则表示法字符汇总:
ls 不支持正则,*是通配符
扩展正则表达式:
删掉空行和注释行:grep -v '^$' filename | grep -v '^#'
扩展正则:egrep -v '^$|^#' filename
扩展正则的字符汇总:
管道符号允许你在检查数据流时,用逻辑OR方式指定正则表达式引擎要用的两个或多个模式。如果任何一个模式匹配了数据流文本,文本就通过测试。如果没有模式匹配,则数据流文本匹配失败。
#例子:在数据流中查找正则表达式cat或dog
$ echo "The cat is asleep" | gawk '/cat|dog/{print $0}
The cat is asleep
$ echo "The dog is asleep" | gawk '/cat|dog/{print $0}'
The dog is asleep
$ echo "The sheep is asleep" | gawk '/cat|dog/{print $0}'
$
printf:格式化输出