2017 07.24 文本处理工具
一 文件查看cat
- -E: 显示行结束符$
创建一个文件——nano f1,在文本编辑中在b和d之间补一个tab键
[root@centos7 ~]#nano f1
[root@centos7 ~]#cat f1
a
d
b d
[root@centos7 ~]#nano f1
[root@centos7 ~]#cat -E f1
a$
b$
c d $
不执行-E时,无法看
-n: 对显示出的每一行进行编号
[root@centos7 ~]#cat -n f1
1 a
2 b
3 c d
-A:显示所有控制符 ——将tab键位显示出来
[root@centos7 ~]#cat -A f1
a$
b$
c^Id $
-b:非空行编号
[root@centos7 ~]#cat -n f1
1 a
2
3
4 b
5
6
7 c d
[root@centos7 ~]#cat -b f1
1 a
2 b
3 c d
-s:压缩连续的空行成一行
image.pngtac——倒着显示(行与行)
image.pngrev——每行字符倒着显示
image.png
二 分页查看文件内容
(1)more: 分页查看文件
在看文件时,执行cat /var/log/message时,不能看见每一页内容,会直接显示最后一行并退出 image.png
此时执行more命令时,可以一页一页的显示,按空格键往下翻页,按b键往下翻页,并显示进度
image.png
more [OPTIONS...] FILE... -d: 显示翻页及退出提示
less:一页一页地查看文件或STDIN输出 ——作用和more类似,pageup,pagedown上下翻页
查看时有用的命令包括: /文本 搜索 文本 n/N 跳到下一个 或 上一个匹配
less 命令是man命令使用的分页器
管道方式—— ls -R |more或是less来进行翻页,但是more的管道方式不能往回翻页
三 显示文本前或后行内容
head(头部),显示前多少个字节
不加选项的时候执行head命令默认显示前十行显示: image.png
-c #: 指定获取前#字节 ——head -c3 file 显示该文件前三个字节的内容 image.png
-n #: 指定获取前#行——head -n3 显示 /etc/passwd文件中的前三行内容
image.png
-#: 指定行数——直接 head -3,直接显示前三行和-n效果一样tail (尾部),显示后多少个字节
不加选项时默认显示后十行: image.png
-c #: 指定获取后#字节
image.png
-n #: 指定获取后#行 image.png
-#:原理同head
-f: 跟踪显示文件新追加的内容,常用日志监控- 打开两个终端观察——tail -f mail.txt
[root@centos7 ~]#tail -f mail.txt
"help"
hi ,root
i am root
The system version is here,please help me to check it ,thanks!
CentOS release 6.9 (Final)
woaini
在另外一个终端窗口
[root@centos7 ~]#echo wo ai laowang >>mail.txt
在之前的窗口显示
[root@centos7 ~]#tail -f mail.txt
"help"
hi ,root
i am root
The system version is here,please help me to check it ,thanks!
CentOS release 6.9 (Final)
woaini
wo ai laowang
四 按列抽取文本cut和合并文件paste
cut
- -d DELIMITER: 指明分隔符,默认tab
-f FILEDS: #: 第#个字段 #,#[,#]:离散的多个字段,例如1,3,6 #-#:连续的多个字段, 例如1-6 混合使用:1-3,5
[root@centos7 ~]#cut -d: -f1,3-5 /etc/passwd——以':'作为分隔符,取第一列和三到五列
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp
sync:5:0:sync
shutdown:6:0:shutdown
-c 按字符切割
[root@centos7 ~]#who
root :0 2017-07-25 08:00 (:0)
root pts/2 2017-07-25 14:11 (:0)
root pts/3 2017-07-25 14:11 (192.168.136.1)
[root@centos7 ~]#who |cut -c-9
root
root
root
--output-delimiter=STRING指定输出分隔符小练习
只显示df内容中use利用率的那一列
方法一:[root@centos7 ~]#df |tr -s " "|cut -d" " -f5
Use%
10%
0%
1%
2%
0%
17%
1%
1%
100%
方法二:[root@centos7 ~]#df |tr -s " "|cut -d" " -f5|tr -d "%"
Use
10
0
1
2
0
17
1
1
100
方法三:[root@centos7 ~]#df |tr -s " "|cut -d" " -f5|cut -d% -f1
Use
10
0
1
2
0
17
1
1
100
方法四:[root@centos7 ~]#df |tr -s " " "%"|cut -d% -f5
Use
10
0
1
2
0
17
1
1
100
练习二 只显示ifconfig ens33的ip地址
[root@centos7 ~]#ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.136.141 netmask 255.255.255.0 broadcast 192.168.136.255
inet6 fe80::28af:dcce:a76d:da1b prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:02:59:96 txqueuelen 1000 (Ethernet)
RX packets 12958 bytes 1090604 (1.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10349 bytes 7092395 (6.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@centos7 ~]#ifconfig ens33 |head -n2|tail -n1 |tr -s " "|cut -d" " -f3
192.168.136.141paste
意义:合并两个文件同行号的列到一行
[root@centos7 ~]#cat f2
I LOVE YOU SISTER
\S
KERNEL \R ON AN \M
[root@centos7 ~]#cat f1
a
b
c d
[root@centos7 ~]#paste f1 f2
a I LOVE YOU SISTER
\S
b KERNEL \R ON AN \M
c d
-d 分隔符:指定分隔符,默认用TAB
paste -d"---" f1 f2
[root@centos7 ~]#paste -d"---" f1 f2
a -I LOVE YOU SISTER
-
-\S
b -KERNEL \R ON AN \M
-
-
c d -
-s : 所有行合成一行显示 ——paste -s f1 f2
a b c d
I LOVE YOU SISTER \S KERNEL \R ON AN \M
五 分析文本的工具
收集文本统计数据wc
计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN中的数据运行 $
wc story.txt 39 237 1901 story.txt
行数 字数 字符数
使用 -l 来只计数行数——显示文件一共有多少行使用
[root@centos7 ~]#cat f1
a
b
c d
[root@centos7 ~]#wc -l f1
7 f1
-w 来只计数单词总数
[root@centos7 ~]#wc -w f1
4 f1
使用 -c 来只计数字节总数
[root@centos7 ~]#wc -c f1
31 f1——空格也算字节
使用 -m 来只计数字符总数
[root@centos7 ~]#cat /etc/issue
i love you sister
\S
Kernel \r on an \m
[root@centos7 ~]#wc -m /etc/issue
42 /etc/issue
文本排序sort
把整理过的文本显示在STDOUT,不改变原始文件
[root@centos7 ~]#df |tr -s " " % |cut -d"%" -f5|sort
0
0
1
1
1
10
100
17
2
Use——按照每行第一字符大小排序
$ sort [options] file(s)
常用选项
-n 执行按数字大小整理
[root@centos7 ~]#df |tr -s " " % |cut -d"%" -f5|sort -n
0
0
Use
1
1
1
2
10
17
100
-r 执行反方向(由上至下)整理
sort -r /etc/issue
image.png
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
image.png >* -t c 选项使用c做为字段界定符 ——类似cut -d
[root@centos7 ~]#sort -t: -k3 -nr /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
tom:x:1009:1001::/app/jackdir:/bin/bash
libai:x:1008:1007::/home/libai:/bin/bash
likui:x:1007:1007::/home/likui:/bin/bash
sasles:x:1006:1007::/home/sasles:/bin/bash
sarah:x:1005:1006:sa,xiaoshou,10088,182568877:/home/sarah:/sbin/nologin
harry:x:1004:1005::/home/harry:/bin/bash
natasha:x:1003:1004::/home/natasha:/bin/bash
wangcai:x:1001:1001::/home/wangcai:/bin/bash
hangnan:x:1000:1000:zhangnan,jishubu,10086,1024:/home/zhangnan:/bin/bashuniq
uniq命令:从输入中删除前后相接的重复的行
image.png
uniq [OPTION]... [FILE]...
-c: 显示每行重复出现的次数
image.png
image.png
-d: 仅显示重复过的行
image.png
-u: 仅显示不曾重复的行 连续且完全相同方为重复
image.png
常和sort 命令一起配合使用: sort userlist.txt | uniq -c
六 Linux文本处理三剑客 —grep
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文 本逐行进行匹配检查;打印匹配到的行 image.png
模式:由正则表达式字符及文本字符所编写的过滤条件
image.png
--color=auto: 对匹配到的文本着色显示 image.png
-v: 显示不被pattern匹配到的行 image.png
-i: 忽略字符大小写 image.png
-c: 统计匹配的行数 image.png
-n:显示匹配的行号 image.png
-o: 仅显示匹配到的字符串
image.png
-q: 静默模式,不输出任何信息
image.png
-A #: after, 后#行 image.png
-B #: before, 前#行 image.png
-C #:context, 前后各#行 image.png
-e:实现多个选项间的逻辑or关系 grep –e ‘cat ’ -e ‘dog’ file image.png
-w:匹配整个单词 :单词的含义是'wang' 'wang-laozhang' 'wang:zhang' 而'wang_lao'不是单词
-E:使用ERE ——等于egerp
-F:相当于fgrep,不支持正则表达式基本正则表达式元字符
字符匹配: . 匹配任意单个字符 'r..t'匹配两个字符
image.png
[] 匹配指定范围内的任意单个字符——grep [root] /etc/passwd
image.png
[^] 匹配指定范围外的任意单个字符—— grep [^root] /etc/passwd
image.png
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母 [:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号正则表达式
匹配次数:用在要指定次数的字符后面,用于指定前面的字 符要出现的次数
'星号' 匹配前面的字符任意次,包括0次 贪婪模式:尽可能长的匹配
.* 任意长度的任意字符
? 匹配其前面的字符0或1次
+ 匹配其前面的字符至少1次
{n} 匹配前面的字符n次
{m,n} 匹配前面的字符至少m次,至多n次
{,n} 匹配前面的字符至多n次
{n,} 匹配前面的字符至少n次
位置锚定:定位出现的位置
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行 ^[[:space:]]$ 空白行
< 或 \b 词首锚定,用于单词模式的左侧
> 或 \b 词尾锚定;用于单词模式的右侧
<PATTERN> 匹配整个单词
分组:() 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:(root)+ 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的 模式所匹配到的字符
示例: (string1+(string2)) \1 :string1+(string2)* \2 :string2
后向引用:引用前面的分组括号中的模式所匹配字符,而非 模式本身
或者:|
示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat'以练习题来展示上述命令'
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两 种方法)
image.png
2、显示/etc/passwd文件中不以/bin/bash结尾的行
image.png
3、显示用户rpc默认的shell程序
image.png
4、找出/etc/passwd中的两位或三位数
image.png
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白 字符开头的且后面存非空白字符的行
image.png
6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多 个空白字符结尾的行
image.png
7、显示CentOS7上所有系统用户的用户名和UID
image.png
8、添加用户bash、testbash、basher、sh、nologin(其shell 为/sbin/nologin),找出/etc/passwd用户名同shell名的行
image.png
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
image.png
egrep及扩展的正则表达式
egrep = grep -E egrep [OPTIONS] PATTERN [FILE...]
扩展正则表达式的元字符:
字符匹配:
. 任意单个字符 [] 指定范围的字符 [^] 不在指定范围的字符
次数匹配:
*:匹配前面字符任意次
?: 0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
位置锚定: ^ :行首 $ :行尾 <, \b :语首 >, \b :语尾
分组: () 后向引用:\1, \2, ...
或者: a|b: a或b C|cat: C或cat (C|c)at:Cat或cat以练习题来解释上述命令
1、显示三个用户root、mage、wang的UID和默认shell
image.png
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包 括下划线)后面跟一个小括号的行
image.png
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
image.png
4、使用egrep取出上面路径的目录名
image.png
5、统计last命令中以root登录的每个主机IP地址登录次数
image.png