grep

1. 文本处理工具的使用:

 

cat 连接文件并打印到标准输出设备,但是文件较大时,翻屏太快,与more或者less连用

命令反着输入(tac)将会反向输出文本文件

用法: cat 选项 参数

 

选项:

-A 显示不可打印字符

-b 对行进行编号,空白行不编号

-s 压缩空白行

-n 对行进行编号,包括空白航

 参数:

 文件列表

示例:

[root@centos7 ~]# cat  -A aa  //加上-A可以看到表示换行的$符号
this is aa file  line 1$
this is aa file  line 2$
$
$
this is aa file  line 3$
this is aa file  line 4$
 [root@centos7 ~]# cat  -b aa //对行进行编号,不包括空白行
1       this is aa file  line 1
2       this is aa file  line 2
 
 
3       this is aa file  line 3
4       this is aa file  line 4
[root@centos7 ~]# cat  -s aa //将行2和行3中间的两个空行进行了压缩
this is aa file  line 1
this is aa file  line 2
 
this is aa file  line 3
this is aa file  line 4
[root@centos7 ~]# tac aa //使用tac反向查看文件
this is aa file  line 2
this is aa file  line 1
[root@centos7 ~]# rev aa //使用rev将行内倒着输出,效果如下
1 enil  elif aa si siht
2 enil  elif aa si siht

2. moreless,less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键

 

more快捷键用法:

选项:

B键:翻页时的上一屏

space键:翻页下一屏

enter键:向前翻一行

Q键退出more命令

 

3. head和tail使用:head用于显示文件的头几行内容,默认显示前十行,可以使用-n 选项指定行数,tail与head功能类似,可以显示文件的尾部,-n同样可以指定显示文件尾多少行 –f可以一直跟踪一个文件内容变化

[root@centos7 ~]# tail -n0 -f aa & //将tail命令放入后台并一直显示

 

4. logger 触发一条日志条目的更新

[root@centos7 ~]# tail -n 0 -f /var/log/messages &
[2] 39486
[root@centos7 ~]# logger "this is a test log message"
[root@centos7 ~]# Aug  5 15:04:21 centos7 root: this is a test log message

 

5. paste:合并文件的内容除了追加的方式还有两个文件的每一行对应另一个文件的一行合并等如:

 [root@centos7 ~]# cat aa //测试文件aa
aaaaaaa
aaaaaaa
 [root@centos7 ~]# cat bb //测试文件bb
bbbbbbbbbbbbb
bbbbbbbbbbbbbb
[root@centos7 ~]# paste aa bb 一行内的合并
aaaaaaa  bbbbbbbbbbbbb
aaaaaaa  bbbbbbbbbbbbbb    
[root@centos7 ~]# paste  –s  aa bb将本来应该一列显示的内容显示成一行
aaaaaaa  aaaaaaa  aaaaaa
bbbbbbbbbbbbb       bbbbbbbbbbbbbb     bbbbbbbbbbb 
[root@centos7 ~]# paste -d* aa bb 指定分隔符为 *
aaaaaaa*bbbbbbbbbbbbb
aaaaaaa*bbbbbbbbbbbbbb
aaaaaa*bbbbbbbbbbb

 

6. 正则表达式:regular expression :由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。正则表达式使用响应的算法,来实现字符的匹配。并且正则表达式分为两类,不同的程序支持不同的正则表达式,有:

基本正则表达式,扩展正则表达式。并且正则表达式需要程序的支持:grep vim less nginx

  基本正则表达式:

         字符匹配:

         .   匹配任意单个字符;

[] : 匹配指定范围内的任意单个字符

[^] : 匹配指定范围外的任意单个字符

[:digit:]  所有数字

[:lower:] 所有小写字母

[:upper:] 所有大写字母

[:alpha:] 所有字母包括大小写

[:punct:] 所有标点符号

[:space:] 空格和tab

 

匹配次数:用在要指定次数的字符后面,指定前面字符出现的次数

*  匹配前面的字符人一次包括0

贪婪模式 尽可能长的匹配

.* 任意长度的任意字符

\? 匹配前面的字符0次或者1

\+ 匹配前面字符最少一次

\{m\} 匹配前面的字符m

\{m,n\} 匹配前面的字符最少m次,最多n次,并且是闭区间

\{,n\} 匹配前面的字符最多n

\{m,\} 匹配前面的字符最少m

 

位置锚定:定位出现的位置

^ 行首锚定,模式的最左侧

$ 行尾锚定,用于模式的最右侧

^pattern$ 整行匹配

         ^$ 空行

         ^[[:space:]]*$ 空白行

\< (也可以用\b)词首锚定,用于单词模式

\> (也可以用\b 词尾锚定,用于单词模式

 

分组: \(\) 将一个或多个字符捆绑在一起处理如\(root\)\+ 匹配多次root这个单词,多个分组时,每一个括号匹配到的字符串都会保存在一个变量中 \1 \2 ,这些变量可以调用出来

7. grep 的使用:grep:(global search regular expresion and print out the line),根据用户指定的模式进行匹配检查,打印匹配的行

  

grep选项:

–color=auto 对匹配到的文本着色显示

-v 取补集,即匹配到的条件的补集

-i 忽略大小写

-n 显示匹配到的行数

-c 统计匹配到的行数

-o 仅显示匹配到的字符串

-q 不输出任何信息

-A -B -C输出后几行或前几行,AB后加相应的数字。-CAB的并集

-e 实现逻辑或关系

-E 使用扩展的正则表达式

 

扩展正则表达式与基本的差别:

1)分组() ,匹配次数{m}{m,n}, + , ? 这些都没有了\的转义

2)或操作:a |b       C|catCcat     (C|c)at Catcat

 

具体示例:

1)显示/proc/meminfo 文件中以大小s 开头的行;( 要求:使用两种方式)

[root@centos7 ~]# cat /proc/meminfo | grep -e "^s.*" -e "^S.*"
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:             13472 kB
Slab:             117520 kB
SReclaimable:      69404 kB
SUnreclaim:        48116 kB
[root@centos7 ~]# cat /proc/meminfo | grep -e "^[sS].*"
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:             13472 kB
Slab:             117520 kB
SReclaimable:      69404 kB
SUnreclaim:        48116 kB
[root@centos7 ~]# cat /proc/meminfo | grep -E "^(s|S).*"
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:             13472 kB
Slab:             117520 kB
SReclaimable:      69404 kB
SUnreclaim:        48116 kB

 

2)显示/etc/passwd 文件中不以/bin/bash 结尾的行

[root@centos7 ~]# grep  -v  "/bin/bash$" /etc/passwd

3)显示用户rpc 默认的shell 程序

[root@centos7 ~]# grep "^rpc\>.*" /etc/passwd |cut -d: -f 7
/sbin/nologin

4)找出/etc/passwd 中的两位或三位数

[root@centos7 ~]# grep -Eo  "[1-9][[:digit:]]{1,2}" /etc/passwd  //o选项只打印匹配到的内容 
12
11
12
100
14
50
99

5)显示/etc/grub2.cfg 文件中,至少以一个空白字符开头的且后面存非空白字符的行

[root@centos7 ~]# grep "^[[:space:]][^[:space:]].*" /etc/grub2.cfg
         load_video
         set gfxpayload=keep
         insmod gzio
         ……

6)找出"netstat -tan" 命令的结果中以'LISTEN' 后跟0 1或多个空白字符结尾的行

[root@centos7 ~]# netstat -tan | grep -e "LISTEN[[:space:]]*$"
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN    
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN

7)添加用户bash testbash basher 以及nologin( shell /sbin/nologin), 而后找出/etc/passwd 文件中用户名同shell名的行

 

[root@centos7 ~]# grep -E "(^[[:alnum:]]+).*/\1$"   /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1008:1008::/home/bash:/bin/bash
basher:x:1010:1010::/home/basher:/bin/bash

7)找出/etc/rc.d/init.d/functions 文件中行首为某单词(

括下划线)

grep -e  "[[:alpha:]_]*().*"  /etc/rc.d/init.d/functions

 

8)使用egrep 取出/etc/rc.d/init.d/functions基名,和目录名:

 

echo /etc/rc.d/init.d/functions | grep -E  "[^/][[:alpha:]]+$" -o
echo /etc/rc.d/init.d/functions | grep -E  "[[:alpha:]/]+.*/"  -o

 

 

 

9)利用扩展正则表达式分别表示0-9 10-99 100-199

200-249 250-255

 

[root@cnode6_8 ~]# grep -we "[[:digit:]]\{1,1\}" a.log  //0-9
0 1 2 22 34 4 5 10 11 111 23 100 123 234 244 250 10000 999
[root@cnode6_8 ~]# grep -we "[1-9][[:digit:]]" a.log  //10-99
01  0 1 2 22 34 4 5 10 11 111 23 100 123 234 244 250 10000 999
 
[root@cnode6_8 ~]# grep -we "1[[:digit:]][[:digit:]]" a.log  //100-199
 
[root@cnode6_8 ~]# grep -we "2[0-4][[:digit:]]" a.log  //200-249
[root@cnode6_8 ~]# grep -we "25[[0-5]]" a.log

 

10)显示ifconfig命令结果中ipv4地址

 
[root@cnode6_8 ~]# ifconfig| grep 'inet\>'|cut -d: -f2|tr -s " " |cut -d " " -f1

 

统计/etc/rc.d/init.d/function中单词出现的次数

cat /etc/rc.d/init.d/functions |tr -c  "[[:alnum:]]" "\n"|tr "[]"  "\n"|tr -s "[[:space:]]"|sort |uniq –c

 

11)用正则表达式表示手机号11 13 17 15  18

grep -e "1[13578][[:digit:]]\{9\}[^[:digit:]]

用正则表达式表示身份证号18

[root@centos7 ~]# grep  -E  "\<[1-9][[:digit:]]{16}[[:digit:]x]\>" aa
123456789012345678

 

12)用正则表达式表示邮箱

[root@centos7 ~]# grep -E "\<[[:alnum:]_]{1,16}@[[:alnum:]]{1,20}.com"  mail_test.txt

13)用正则表达式表示IP地址

[root@centos7~]# grep -E "(((\<[[:digit:]]\>)|(\<[1-9][[:digit:]]\>)|(\<1[[:digit:]]{2,2}\>)|(\<2[0-4][[:digit:]]\>)|\<(25[0-5]\>)).){3}((\<[[:digit:]]\>)|(\<[1-9][[:digit:]]\>)|(\<1[[:digit:]]{2,2}\>)|(\<2[0-4][[:digit:]]\>)|\<(25[0-5]\>))"  IPtest.txt

注意:方括号是匹配一个字符,里面加了()也不会把小括号里面的内容当成一个整体,而是把小括号当成一个普通字符匹配:

[root@centos7 testdir]# grep -E "[(jack)(34)]" aa

34 ()    (78   789 jac  jack  cui   23jack23

[root@centos7 testdir]# grep -E "(jack)|(34)" aa

34 ()    (78   789 jac  jack  cui   23jack23

原创文章,作者:jack_cui,如若转载,请注明出处:http://www.178linux.com/30115