在日常的linux运维工作当中,我们经常要在一些文本当中抽取过滤出我们所需要的信息,从而达到我们的需求,需要特定的文本处理工具来帮我们完成此类操作
本章节主要讲解的内容有:
文件查看:cat
分页查看文本:less、more
抽取文件特定行数:head、tail
抽取文本特定列:cut
合并文本:paste
文本统计:wc
文本排序并统计:sort、uniq
比较文件:diff、patch
cat:文本查看
usage:cat [OPTIONS…] FILE…
-E:在每行结尾添加$符
-A:显示所有控制符
-n:每行显示行号
-b:非空白行编号
-s:将重复的空白行压缩为一行
[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 ~]#
more、less:分页查看内容
usage:more [OPTIONS…] FILE…
-d:显示翻页及退出提示
usage:less [OPTIONS…] FILE…
默认man命令就是调用less来完成分页查看
head、tail:抽取文本前后行数
usage:head [OPTION…] FILE…
-n #:抽取文本前#行
-c #:抽取文本前#个字节7
-#:指定行数
usage:tail [OPTIONS…] FILE…
-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:抽取文本
usage:cut [OPTIONS…] FILE…
-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:合并文本
usage:paste [OPTIONS] FILE…
-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:文本统计
usage:wc [OPTIONS…] FILLE…
-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:文本排序
usage:sort [OPTIONS…] FILE…
-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:统计重复的行
usage:uniq [OPTION…] FILE…
-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
由一类特殊字符文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或统配的功能
扩展正则表达式:BRE
扩展正则表达式:ERE
Linux文本处理三剑客之一:
grep:文本过滤工具,Global search REgularexpression and Print
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行
grep:基本正则表达式,-E -F
egrep:扩展正则表达式,-G -F
fgrep:不支持正则表达式元字符
grep [OPTIONS…] PATTERN [FILE…]
OPTIONS:
–color=auto:对匹配到的文本高亮显示
-i:匹配时忽略大小写
-o:只显示匹配到的字符(默认会显示整行)
-v:显示没有被模式所匹配到的行
-q:静默模式,无论是否匹配成功 都不显示
-e PAT1 -e PAT2:匹配PAT1或PAT2
-c:显示匹配到的行数
-n:显示匹配到的行号
-E:启用扩展正则表达式
-A #:显示匹配到的行的后#行
-B #:显示匹配到的行的前#行
-C #:显示匹配到的行的前后各#行
-w:匹配整个单词
字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内任意单个字符
[^]:匹配指定范围外任意单个字符
字符集:[:digit:]:匹配数字
[:upper:]:匹配大写字母
[:lower:]:匹配小写字母
[:alpha:]:匹配大小写字母
[:alnum:]:匹配字母加数字
[:space:]:匹配空白字符
[:punct:]:匹配标点符号
次数匹配:
*:其前字符出现任意次
.*:匹配其任意长度任意字符
\?:匹配其前字符1此或0此
\+:匹配其前字符至少1次
\{n\}:匹配其前一个字符n此
\{m,n\}:匹配其前一个字符至少m此,至多n此
\{m,\}:匹配其前一个字符至少m此,至多不限
\{,n\}:匹配其前一个字符至多n此,至少不限
位置锚定:
^:锚定行首,其右边的内容必须出现在行首,此锚定字符必须出现在行首
$:锚定行尾,其左边的内容必须出现在行尾,此锚定字符必须出现在行尾
^$:锚定空白行
^PATTERN$:锚定整行内容
^[[:space:]]*$:锚定包含空白字符的行
单词:非特殊字符组成的连续字符(字符串)都成为单词
\<或\b:锚定次首,其后面的字符必须出现在词首
\>或\b:锚定词尾,其前面的字符必须出现在词尾
\<PATTERN\>:匹配完整单词
分组及引用:
\(\):将一个或多个字符捆绑在一起,当做一个整体来处理
后向引用:引用前面括号内的模式所匹配到的所有字符
分组括号中的模式匹配到的内容会被正则引擎自动记录于内部的变量中,这些变量为;
\1:引用从最左侧起第一个小括号与之匹配的右括号之间的模式所匹配到的所有字符
\2:应用从最左侧起第二个小括号与之匹配的右括号之间的模式所匹配到的所有字符
…
egrep:支持扩展的正则表达式
扩展表达式的元字符:
字符匹配:
.:任意单个字符
[]:指定范围内任意单个字符
[^]:指定范围外任意单个字符
字符集:
[:digit:]:匹配数字
[:space:]:匹配空白字符
[:alpha:]:匹配大小写字母
[:alnum:]:匹配字母加数字
[:upper:]:匹配大写字母
[:lower:]:匹配小写字母
[:punct:]:匹配标点符号
次数匹配:
*:匹配其前面的字符任意次
.*:任意长度的任意字符
?:前面的字符出现1次或0此
+:前面的字符至少出现1次
{n}:匹配其前面的的字符n次
{m,n}:匹配其前面的字符至少m次,至多n次
{m,}:匹配其前面的字符至少m此,至多不限
{,n}:匹配其前面的字符至多n此,至少不限
位置锚定:
^:锚定行首,其右边的内容必须出现在行首,此字符必须写在PATTERN的最左侧
$:锚定行尾,其左边的内容必须出现在行首,此字符必须写在PATTERN的最右侧
^$:匹配空白行
^PATTERN$:匹配整行内容
^[[:space:]]*$:匹配包含空白字符的行
单词锚定:
\<或\b:锚定词首,其右边的内容必须出现在词首
\>或\b:锚定词尾,其左边的内容必须出现在词首
\<PATTERN\>:锚定完整单词
分组及引用:
():将一个或多个字符捆绑在一起当做一个整体来处理
后向引用:引用前面括号内的模式所匹配到的所有字符
\1:引用从最左侧起第一个小括号与之匹配的右括号之间的模式所匹配到的所有字符
\2:应用从最左侧起第二个小括号与之匹配的右括号之间的模式所匹配到的所有字符
…
或:
a|b:a或者b
C|cat:C或cat
(c|C)at:cat或Cat
原创文章,作者:zhai796898,如若转载,请注明出处:http://www.178linux.com/30749