目录
背景:
在shell脚本中经常会做一些文本的处理,比如日志取值、内存取值、还有文件名称的取值等等都是文本的处理,在这些文本的处理过程中会经常使用到grep、awk、sed也叫做shell脚本的文本三剑客,如下就是具体的介绍grep、awk和sed的常规操作。
一、grep
grep也是过滤,作用是过滤来自一个文件或标准输入匹配模式内容。 除了 grep 外,还有 egrep、fgrep。egrep 是 grep 的扩展,相当于 grep -E。fgrep 相当于 grep - f,用的少。
格式:
Usage: grep [OPTION]... PATTERN [FILE]...
1、OPINTION参数选项
支持的正则 | 作用描述 |
-E,--extended-regexp | 模式是扩展正则表达式(ERE) |
-P,--perl-regexp | 模式是 Perl 正则表达式 |
-e,--regexp=PATTERN | -e,--regexp=PATTERN |
-f,--file=FILE | 从文件每一行获取匹配模式 |
-i,--ignore-case | 忽略大小写 |
-w,--word-regexp | 模式匹配整个单词 |
-x,--line-regexp | 模式匹配整行 |
-v,--invert-match | 打印不匹配的行,常说取反的 |
输出控制 | 作用描述 |
-m,--max-count=NUM | 输出匹配的结果 num 数 |
-n,--line-number | 打印行号 |
-H,--with-filename | 打印每个匹配的文件名 |
-h,--no-filename | 不输出文件名 |
-o,--only-matching | 只打印匹配的内容 |
-q,--quiet | 不输出正常信息 |
-s, --no-messages | 不输出错误信息 |
-r,--recursive | 递归目录 |
-c,--count | 只打印每个文件匹配的行数 |
--include=FILE_PATTERN --exclude=FILE_PATTERN --exclude-from=FILE --exclude-dir=PATTERN | 只检索匹配的文件 跳过匹配的文件 跳过匹配的文件,来自文件模式 跳过匹配的目录 |
内容行控制 | 作用描述 |
-B,--before-context=NUM | 打印匹配的前几行 |
-A,--after-context=NUM | 打印匹配的后几行 |
-C,--context=NUM | 打印匹配的前后几行 |
--color[=WHEN] | 匹配的字体颜色 |
2、grep功能演示
示例1:
grep比较两个不同的文件的相同内容,并输出 b 文件中在 a 文件相同行的内容,这里输出相同行,不是相同的内容就输出的,切记。
[root@~ test]# grep -f a.txt b.txt
root:x:0:0:root:/root:/bin/bash
mwop:x:1000:1000::/home/mwop:/bin/bash
nginx:x:799:798:Nginx web server:/var/lib/nginx:/sbin/nologin
示例2:
grep比较两个不同文件的内容,并输出 b 文件中在 a 文件不同的行,这里校验标准也是行
[root@~ test]# grep -v -f a.txt b.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
示例3:
grep匹配多个模式,这里的xargs的作用就是将前面echo的三个参数按照每次一个参数的方式输出到后面的命令使用
[root@~ test]# echo "a bc de" |xargs -n1 |grep -e 'a' -e 'bc'
a
bc
示例4:
grep去除空格 http.conf 文件空行或开头#号的行
#原文本信息:
[root@~ test]# cat a.txt
root:x:0:0:root:/root:/bin/bash
mwop:x:1000:1000::/home/mwop:/bin/bash
nginx:x:799:798:Nginx web server:/var/lib/nginx:/sbin/nologin
# back
#去除操作之后的信息:
[root@~ test]# grep -E -v "^$|^#" a.txt
root:x:0:0:root:/root:/bin/bash
mwop:x:1000:1000::/home/mwop:/bin/bash
nginx:x:799:798:Nginx web server:/var/lib/nginx:/sbin/nologin
示例5:
grep匹配开头不分大小写的单词,xargs的作用和上面的一样,就是每次传递一个参数给后面的命令执行。[这里是匹配内容的范围]
[root@~ test]# echo "A a b c" |xargs -n1 |grep '[Aa]'
A
a
示例6:
grep只显示匹配的字符串,匹配所有的字符串
[root@~ test]# echo "this is a test" |grep -o 'is'
is
is
示例7:
grep输出匹配的前五个数字,至少是两个字符的,{2}表示匹配至少两个字符位的内容
[root@~ test]# seq 1 20 |grep -m 5 -E '[0-9]{2}'
10
11
12
13
14
示例8:
grep统计匹配多少行,这里匹配至少2个字符位的内容,并统计有多少行
[root@~ test]# seq 1 20 |grep -c -E '[0-9]{2}'
11
示例9:
grep匹配 b 字符开头的行,xargs就是每次输出一个参数到后面的命令执行
[root@~test]# echo "a bc de" |xargs -n1 |grep '^b'
bc
示例10:
grep匹配 de 字符结尾的行并输出匹配的行,xargs的作用和上面的一样的,-n的作用是输出匹配的内容,同时打印出匹配内容所在的行号。
[root@~ test]# echo "a ab abc abcd abcde" |xargs -n1 |grep -n 'de$'
5:abcde
示例11:
grep递归搜索/etc 目录下包含 ip 内容的 conf 后缀文件
[root@VM-8-10-centos ~]# grep -r 'user="root"' /etc --include *.conf
/etc/dbus-1/system.d/org.freedesktop.systemd1.conf: <policy user="root">
/etc/dbus-1/system.d/wpa_supplicant.conf: <policy user="root">
/etc/dbus-1/system.d/org.freedesktop.locale1.conf: <policy user="root">
/etc/dbus-1/system.d/com.redhat.tuned.conf: <policy user="root">
/etc/dbus-1/system.d/teamd.conf: <policy user="root">
/etc/dbus-1/system.d/org.freedesktop.timedate1.conf: <policy user="root">
/etc/dbus-1/system.d/org.freedesktop.machine1.conf: <policy user="root">
/etc/dbus-1/system.d/nm-ifcfg-rh.conf: <policy user="root">
/etc/dbus-1/system.d/org.freedesktop.hostname1.conf: <policy user="root">
/etc/dbus-1/system.d/dbus-abrt.conf: <policy user="root">
/etc/dbus-1/system.d/org.freedesktop.NetworkManager.conf: <policy user="root">
/etc/dbus-1/system.d/org.freedesktop.import1.conf: <policy user="root">
/etc/dbus-1/system.d/org.freedesktop.login1.conf: <policy user="root">
/etc/dbus-1/system.d/nm-dispatcher.conf: <policy user="root">
/etc/dbus-1/system.d/FirewallD.conf: <policy user="root">
示例12:
grep查询条件排除搜索 bak 后缀的文件,简单的理解就就是查询符合内容的文件,但是这个文件的后缀不是bak的。
注:在/opt目录下存在a.bak文件和a、file文件,其中a和file的文件中含有root字符串,
[root@VM-8-10-centos /]# grep -r 'root' /opt --exclude *.bak
/opt/a:root
/opt/file:root
示例13:
grep排除来自file文件的匹配内容,具体匹配文件名称
[root@VM-8-10-centos opt]# grep -r 'root' /opt --exclude-from file
/opt/a:root
/opt/a.bak:root
示例14:
grep匹配 41 或 42 的数字,seq 41 45表示获取41到45的数字,默认是整数的
[root@~ opt]# seq 41 45 |grep -E '4[12]'
41
42
示例15:
grep匹配至少 2 个字符的内存,seq 13表示显示到13的整数值
[root@~ opt]# seq 13 |grep -E '[0-9]{2}'
10
11
12
13
示例16:
grep匹配至少 2 个字符的单词,最多 3 个字符的单词,xargs的作用和上面的一样,每次输出一个参数到后面的命令执行
[root@~ opt]# echo "a ab abc abcd abcde" |xargs -n1 |grep -E -w -o '[a-z]{2,3}'
ab
abc
示例17:
grep匹配所有 IP
[root@VM-8-10-centos opt]# ifconfig |grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
10.0.8.10
255.255.252.0
10.0.11.255
127.0.0.1
255.0.0.0
示例18:
grep打印匹配结果所在行内容和后 3 行的内容
[root@~ opt]# seq 1 10 |grep 5 -A 3
5
6
7
8
示例19:
grep打印匹配结果所在行的内容及前 3 行的内容
[root@~ opt]# seq 1 10 |grep 5 -B 3
2
3
4
5
示例20:
grep打印匹配结果所在行的内容及前后 3 行的内容
[root@~ opt]# seq 1 10 |grep 5 -C 3
2
3
4
5
6
7
8
示例21:
grep报错不显示出报错提示信息
#在grep中加入-s就是执行失败,也不显示报错信息,正常则显示输出的信息
[root@VM-8-10-centos opt]# grep 'a' abc
grep: abc: No such file or directory
[root@VM-8-10-centos opt]# grep -s 'a' abc
[root@VM-8-10-centos opt]# echo $?
2
#在grep中加入-q表示正常查询不显示输出内容,错误会显示
[root@VM-8-10-centos opt]# grep 'a' a.txt
iaaaaaa
aa
[root@VM-8-10-centos opt]# grep -q 'a' a.txt
总结:
如上就是grep的命令的使用和演示了,希望可以帮助到大家,点赞加关注!!!