标签:文本处理工具、grep
常见的文本处理工具
在日常的linux运维工作当中,我们经常要在一些文本当中抽取过滤出我们所需要的信息,从而达到我们的需求,需要特定的文本处理工具来帮我们完成此类操作
本章节主要讲解的内容有:
文件查看:cat
分页查看文本:less、more
抽取文件特定行数:head、tail
抽取文本特定列:cut
合并文本:paste
文本统计:wc
文本排序并统计:sort、uniq
比较文件:diff、patch
cat:连结查看文本和输出至标准输出
-n:为每行添加行号
-A:显示所有控制符
-E:为每行显示结束符$
-s:压缩重复的空白行
-b:非空行进行编号
[root@CentOS6 ~]# cat -A test.txt #显示所有控制字符 one$ two$ $ three$ $ [root@CentOS6 ~]# cat -E test.txt #在每行结尾添加$符 one$ two$ $ three$ $ [root@CentOS6 ~]# cat -b test.txt #非空行编号 1one 2two 3three [root@CentOS6 ~]# cat -n test.txt #显示行号 1one 2two 3 4three 5 [root@CentOS6 ~]# cat -s test.txt #压缩空白行 one two three [root@CentOS6 ~]#
nl:将文件每行添加行号显示
tac:逆序显示文件内容
rev:反向显示文件内容
more: 分页查看文件
more [OPTIONS...] FILE...
-d: 显示翻页及退出提示
less:一页一页查看文本文件
查看时有用的命令包括:
/文本搜索文本
n/N跳到下一个or 上一个匹配
head:抽取文本前n行
-n #:抽取文本前#行
-c #:抽取文本前#个字节7
-#:指定行数
tail:抽取文本后n行
-n #:抽取文本后#行
-#:指定行数
-c #:抽取文本后#个字节
-f:追踪文本新添加的内容,不退出文本
[root@CentOS6 ~]# head -3 /etc/passwd #抽取文本的前三行 [root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@CentOS6 ~]# tail -3 /etc/passwd #抽取文本的后三行 nologin:x:510:514::/home/nologin:/sbin/nologin mage:x:511:515::/home/mage:/bin/bash wang:x:512:516::/home/wang:/bin/bash [root@CentOS6 ~]# head -c 100 /etc/passwd #抽取文本前100个字节 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nol[root@CentOS6 ~]# [root@CentOS6 ~]# tail -c 100 /etc/passwd #抽取文本后100个字节 ome/nologin:/sbin/nologin mage:x:511:515::/home/mage:/bin/bash wang:x:512:516::/home/wang:/bin/bash [root@CentOS6 ~]#
cut:抽取文本
-d DELIMITER:指明分隔符,默认tab
-f FILEDS:
#:第#个字段
#,#:离散表示法,例如1,3,5
#-#:连续表示法,例如1-3
#,#-#,#:混合表示法例如,1,3-5,7
-c:按字符切割
--output-delimiter:指定输出分隔符
[root@CentOS6 ~]# cat test.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@CentOS6 ~]# cut -d: -f1,3 test.txt #以:为分隔符,抽取文本的第1,3列 root:0 bin:1 daemon:2 [root@CentOS6 ~]#
paste:合并文本
-d DELIMITER:指定输出分隔符
-s:所有行显示为一行
[root@CentOS6 ~]# paste issue test.txt #将两个文本内容合并 CentOS release 6.8 (Final)root:x:0:0:root:/root:/bin/bash Kernel \r on an \mbin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@CentOS6 ~]# paste -s issue test.txt #一个文本内容显示为一行 CentOS release 6.8 (Final)Kernel \r on an \m root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin [root@CentOS6 ~]#
wc:文本统计
-c:统计字节数
-l:统计行数
-w:统计单词书
-m:统计字节数
[root@CentOS6 ~]# wc -l /etc/passwd #统计行数 47 /etc/passwd [root@CentOS6 ~]# wc -w /etc/passwd #统计单词数 67 /etc/passwd [root@CentOS6 ~]# wc -m /etc/passwd #统计字节数 2143 /etc/passwd [root@CentOS6 ~]# wc -c /etc/passwd #统计字节数 2143 /etc/passwd [root@CentOS6 ~]#
sort:文本排序
-u:重复的行只出现一次
-r:逆序排序
-n:按数字从小到大排序
-f:忽略大小写
-t DELIMITER:指明分隔符
-k #:按照指定的分隔符来指定列
[root@CentOS6 ~]# cat test.txt 1 1 2 1 3 [root@CentOS6 ~]# sort -u test.txt #重复的行只显示一次 1 2 3 [root@CentOS6 ~]# sort -n test.txt #数字从小到大排序 1 1 1 2 3 [root@CentOS6 ~]# sort -r test.txt #逆序排序 3 2 1 1 1 [root@CentOS6 ~]# sort -t‘ ‘ -k1 -n test.txt #对指定的列排序 1 1 1 2 3 [root@CentOS6 ~]#
uniq:统计重复的行
-c:显示重复行的重复次数
-d:仅显示重复过的行
-u:显示不曾重复的行
一般和sort命令搭配使用
[root@CentOS6 ~]# cat test.txt 1 1 2 1 3 [root@CentOS6 ~]# uniq -c test.txt #显示重复行的重复次数 2 1 1 2 1 1 1 3 [root@CentOS6 ~]# uniq -d test.txt #仅显示重复的行 1 [root@CentOS6 ~]# uniq -u test.txt #显示不曾重复的行 2 1 3 [root@CentOS6 ~]#
diff:比较两个文件的区别
以逐行的方式比较两个文件的不同之处
diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATHCH_FILE
-u:使用unfied机制,即显示要修改的行的上下文,默认为三行
patch:向文件打补丁
path [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE
patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE
使用以上命令来完成几道练习题:
1.找出ifconfig命令中的IP地址
[root@CentOS6 ~]# ifconfig #命令执行结果 eth0 Link encap:Ethernet HWaddr 00:0C:29:52:81:65 inet addr:10.1.252.233 Bcast:10.1.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:fe52:8165/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:582651 errors:0 dropped:0 overruns:0 frame:0 TX packets:27749 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:60558505 (57.7 MiB) TX bytes:4391524 (4.1 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:192 errors:0 dropped:0 overruns:0 frame:0 TX packets:192 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:23756 (23.1 KiB) TX bytes:23756 (23.1 KiB) [root@CentOS6 ~]# ifconfig | head -2 #截取前两行 eth0 Link encap:Ethernet HWaddr 00:0C:29:52:81:65 inet addr:10.1.252.233 Bcast:10.1.255.255 Mask:255.255.0.0 [root@CentOS6 ~]# ifconfig | head -2 | tail -1 #截取最后一行 inet addr:10.1.252.233 Bcast:10.1.255.255 Mask:255.255.0.0 [root@CentOS6 ~]# ifconfig | head -2 | tail -1 | cut -d: -f2 #以:为分隔符,截取第二列 10.1.252.233 Bcast [root@CentOS6 ~]# ifconfig | head -2 | tail -1 | cut -d: -f2 | cut -d‘ ‘ -f1 #取出IP地址 10.1.252.233 [root@CentOS6 ~]#
2.查出分区空间使用率的最大百分比值
[root@CentOS6 ~]# df #命令输出结果 Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 50264772 4350148 43354624 10% / tmpfs 502068 76 501992 1% /dev/shm /dev/sda1 194241 34110 149891 19% /boot /dev/sda3 20027260 44992 18958268 1% /testdir /dev/sr0 3824484 3824484 0 100% /media/CentOS_6.8_Final [root@CentOS6 ~]# df | tr -s ‘ ‘ #压缩空格 Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 50264772 4350148 43354624 10% / tmpfs 502068 76 501992 1% /dev/shm /dev/sda1 194241 34110 149891 19% /boot /dev/sda3 20027260 44992 18958268 1% /testdir /dev/sr0 3824484 3824484 0 100% /media/CentOS_6.8_Final [root@CentOS6 ~]# df | tr -s ‘ ‘ | cut -d‘ ‘ -f5 #取出第五列 Use% 10% 1% 19% 1% 100% [root@CentOS6 ~]# df | tr -s ‘ ‘ | cut -d‘ ‘ -f5 | sort -n #数字从小到大排序 Use% 1% 1% 10% 19% 100% [root@CentOS6 ~]# df | tr -s ‘ ‘ | cut -d‘ ‘ -f5 | sort -n | tail -1 #取出百分比最大值 100% [root@CentOS6 ~]#
3.查出用户UID最大值的用户名、UID及shell类型
[root@CentOS6 ~]# sort -n -t: -k3 /etc/passwd #UID从小打到排序 root:x:0:0:root:/root:/bin/bash 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 halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin haldaemon:x:68:68:HAL daemon:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin zhai:x:500:500::/home/zhai:/bin/bash hadoop:x:501:501::/home/hadoop:/bin/bash zaizai:x:502:503::/home/zaizai:/bin/bash alice:x:503:507::/home/alice:/bin/bash tom:x:504:508::/home/tom:/bin/bash user1:x:505:509::/home/user1:/bin/bash user2:x:506:510::/home/user2:/bin/bash bash:x:507:511::/home/bash:/bin/bash testbash:x:508:512::/home/testbash:/bin/bash basher:x:509:513::/home/basher:/bin/bash nologin:x:510:514::/home/nologin:/sbin/nologin mage:x:511:515::/home/mage:/bin/bash wang:x:512:516::/home/wang:/bin/bash nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@CentOS6 ~]# sort -n -t: -k3 /etc/passwd | tail -1 #取出UID最大的用户 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@CentOS6 ~]# sort -n -t: -k3 /etc/passwd | tail -1 | cut -d: -f1,3,7 #取出用户名、UID、shell nfsnobody:65534:/sbin/nologin [root@CentOS6 ~]#
4.查出/tmp的权限,以数字方式显示
[root@CentOS6 ~]# stat /tmp #命令执行结果 File: `/tmp‘ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 802h/2050d Inode: 1835009 Links: 13 Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-08-05 11:54:12.000000000 +0800 Modify: 2016-08-06 07:45:28.201523630 +0800 Change: 2016-08-06 07:45:28.201523630 +0800 [root@CentOS6 ~]# stat /tmp | head -4 | tail -1 #取出包含权限的行 Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root) [root@CentOS6 ~]# stat /tmp | head -4 | tail -1 | cut -d: -f2 #指定以:为分隔符,取出第二列 (1777/drwxrwxrwt) Uid [root@CentOS6 ~]# stat /tmp | head -4 | tail -1 | cut -d: -f2 | tr -sc ‘[0-9]‘ ‘\n‘ #取出八进制权限 1777 [root@CentOS6 ~]#
5.统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
[root@CentOS6 ~]# netstat -tn #命令输出结果 Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 10.1.252.233:36635 10.1.252.233:22 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.250.60:58479 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.252.84:40544 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.253.23:35810 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.252.84:40543 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.250.60:58179 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.252.233:36635 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.253.23:35811 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.250.60:61317 ESTABLISHED [root@CentOS6 ~]# netstat -tn | tr -s ‘ ‘ #压缩空白字符 Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 10.1.252.233:36635 10.1.252.233:22 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.250.60:58479 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.252.84:40544 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.253.23:35810 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.252.84:40543 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.250.60:58179 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.252.233:36635 ESTABLISHED tcp 0 0 10.1.252.233:22 10.1.253.23:35811 ESTABLISHED tcp 0 64 10.1.252.233:22 10.1.250.60:61317 ESTABLISHED [root@CentOS6 ~]# netstat -tn | tr -s ‘ ‘ | cut -d‘ ‘ -f5 #截取第五列 servers) Address 10.1.252.233:22 10.1.250.60:58479 10.1.252.84:40544 10.1.253.23:35810 10.1.252.84:40543 10.1.250.60:58179 10.1.252.233:36635 10.1.253.23:35811 10.1.250.60:61317 [root@CentOS6 ~]# netstat -tn | tr -s ‘ ‘ | cut -d‘ ‘ -f5 | cut -d: -f1 #过滤掉端口号,只留IP地址 servers) Address 10.1.252.233 10.1.250.60 10.1.252.84 10.1.253.23 10.1.252.84 10.1.250.60 10.1.252.233 10.1.253.23 10.1.250.60 [root@CentOS6 ~]# netstat -tn | tr -s ‘ ‘ | cut -d‘ ‘ -f5 | cut -d: -f1 | tr -sc ‘[0-9].‘ ‘\n‘ #删除IP地址以外的其他字符 10.1.252.233 10.1.250.60 10.1.252.84 10.1.253.23 10.1.252.84 10.1.250.60 10.1.252.233 10.1.253.23 10.1.250.60 [root@CentOS6 ~]# netstat -tn | tr -s ‘ ‘ | cut -d‘ ‘ -f5 | cut -d: -f1 | tr -sc ‘[0-9].‘ ‘\n‘ | sort #将IP地址排序 10.1.250.60 10.1.250.60 10.1.250.60 10.1.252.233 10.1.252.233 10.1.252.84 10.1.252.84 10.1.253.23 10.1.253.23 [root@CentOS6 ~]# netstat -tn | tr -s ‘ ‘ | cut -d‘ ‘ -f5 | cut -d: -f1 | tr -sc ‘[0-9].‘ ‘\n‘ | sort | uniq -c #显示重复行的重复次数 1 3 10.1.250.60 2 10.1.252.233 2 10.1.252.84 2 10.1.253.23 [root@CentOS6 ~]# netstat -tn | tr -s ‘ ‘ | cut -d‘ ‘ -f5 | cut -d: -f1 | tr -sc ‘[0-9].‘ ‘\n‘ | sort | uniq -c | sort -n -t‘ ‘ -k1 #将重复次数从小到大排序 1 2 10.1.252.233 2 10.1.252.84 2 10.1.253.23 3 10.1.250.60 [root@CentOS6 ~]#
正则表达式:Regular Expression
Linux上文本处理三剑客:
grep:文本过滤工具(模式:pattern)
grep:基本正则表达式,-E,-F
egrep:扩展正则表达式,-G,-F
fgrep:不支持正则表达式
sed:stream editor,流编辑器;文本编辑工具
awk:Linux上的实现为gawk,文本报告生成器(格式化文本)
正则表达式:Regular Expression,REGEXP
由一类特殊字符文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或统配的功能
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
元字符:
grep:文本过滤工具
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行
模式:由正则表达式的元字符及文本字符所编写出的过滤条件
正则表达式引擎:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
OPTIONS:
--color=auto:对匹配到的文本着色后高亮显示
-i:在匹配时忽略大小写
-o:只显示匹配到的字符串
-v:显示没有被匹配到的内容
-E:使用扩展正则表达式
-q:静默模式,无论匹配到或匹配不到都不输出任何信息
-A #:显示被匹配到的行的后#行
-B #:显示被匹配到的行的前#行
-C #:显示被匹配到的行的前后各#行
-e PAT1 -e PAR2:匹配PAT1或PAT2
-w:匹配完整单词
-c:显示匹配到的行数
-n:显示匹配到的行号
基本正则表达式的元字符:
字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内任意单个字符
[^]:匹配指定范围外任意单个字符
[:space:],[:digit:],[:alpha:],[:alnum:],[:punct:],[:upper:],[:lower:]
匹配次数:用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数,默认工作于贪婪模式
*:匹配其前面字符出现任意次
.*:表示匹配任意长度的任意字符
\?:匹配其前面字符出现1次或0次,(可有可无)
\+:匹配其前面的字符至少出现1次
\{m\}:匹配其前面的字符m次
\{m,n\}:其匹配前一个字符至少m次,至多n次
\{m,\}:至少m次
\{0,n\}:至多n次
位置锚定:
^:其后面的字符必须出现在行首,用于模式的最左侧
$:其后面的字符必须出现在行尾,用于模式的最右侧
^PATTERN$:用于PATTERN来匹配整行
^$:匹配空白行
^[[:space:]]*$:匹配包含空格的空白行
单词:非特殊字符组成的连续字符(字符串)都成为单词
\<或\b:锚定词首,其后面的字符必须出现在词首,用于单词模式的左侧
\>或\b:锚定词尾,其后面的字符必须出现在词尾,用于单词模式的右侧
\<PATTERN\>:匹配完整单词
分组及引用:
\(\):将一个或多个字符捆绑子一起,当做一个整体进行处理
note:分组括号中的模式匹配到的内容会被正则引擎自动记录于内部的变量中,这些变量为;
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\3:
...
后向引用:引用前面的分组括号中的模式所匹配到的字符
egrep:
支持扩展的正则表达式实现类似于grep文本过滤功能:grep -E
grep [OPTIONS] PATTERN [FILE...]
选项:
-i, -o, -v, -q, -A, -B, -C
-G:支持基本正则表达式
扩展正则表达式的元字符:
字符匹配:
.:任意单个字符
[]:指定范围内任意单个字符
[^]:指定范围外的任意单个字符
次数匹配:
*:任意次,0、1或多次
+:其前面的字符至少出现1次
?:其前面的字符出现0次或1次
{m}:其前面的字符出现m次
{m,n}:至少m次,至多n次
{0,n}:至多n次,至少不限
{m,}:至少m次,至多不限
位置锚定:
^:行首锚定
$:行尾锚定
\<,\b:词首锚定
\>,\b:词尾锚定
分组引用:
():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中
后向应用:\1,\2,\3,...
或:
a|b:a或者b
C|cat:C或cat
(c|C)at:cat或Cat
标签:文本处理工具、grep
原文地址:http://zhaizhai.blog.51cto.com/11881047/1839864