1、文本工具
1.1 抽取文本的工具
- 文件内容:less和cat
- 文件截取:head和tail
- 按列抽取:cut
文件查看
- 文件查看命令
cat,tac,rev - cat [OPTION]... [FILE]...
-E:显示行结束符$
-n:对显示出的每一行进行编号
-A:显示所有控制符
-b:非空行编号
-s:压缩连续的空行成一行 - tac 反向显示文件内容(上下方向)
-
rev 反向显示文件内容(左右方向)
[root@centos7 ~]#cat -E f1 aa$ bb$ cc$ [root@centos7 ~]#cat -n f1 1 aa 2 bb 3 cc [root@centos7 ~]#cat -A f3 aa$ bb c$ cc$ $ dd$ $ [root@centos7 ~]#cat -b f3 1 aa 2 bb c 3 cc 4 dd
tac:倒序查看(根据列)
[root@centos7 ~]#cat f1 aa bb cc [root@centos7 ~]#tac f1 cc bb aa
rev:倒序查看(根据行)
[root@centos7 ~]#cat f2 aa bb cc [root@centos7 ~]#rev f2 cc bb aa
分页查看文件内容
- more:分页查看文件
用法:more [OPTIONS...] FILE...
-d: 显示翻页及退出提示
注意:more查看文件,到文件内容底部以后会自动退出 - less:一页一页地查看文件或STDIN输出
查看时有用的命令包括:
/文本搜索 文本
n/n 跳到下一个或上一个匹配
less 该命令是man命令使用的分页器
显示文本前或后行内容
- head [OPTION]... [FILE]...
-c #: 指定获取前#字节
-n #: 指定获取前#行
-#: 指定行数 - tail [OPTION]... [FILE]...
-c #: 指定获取后#字节
-n #: 指定获取后#行
-#:
-f: 跟踪显示文件fd新追加的内容,常用日志监控。但是文件在其他窗口被删除,不会有提示
相当于 --follow=descriptor
-F: 跟踪文件名,相当于—follow=name --retry。文件在其他窗口被删除,会出现提示
知识扩展:
取前10位除了字母和数字的随机数作为密码
cat /dev/urandom | tr -dc '[:alnum:]' | head -c10
tr命令
注:由于该命令可以与本章多个命令相结合,因此在此回顾一下tr命令相关内容
- 转换和删除字符
- 语法:tr [OPTION]... SET1 [SET2]
- 选项:
-c –C --complement:取字符集的补集
-d --delete:删除所有属于第一字符集的字符
-s --squeeze-repeats:把连续重复的字符以单独一个字符表示
-t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符[root@centos7 ~]#tr 'a-z' 'A-Z' aaabbbccc123 AAABBBCCC123 [root@centos7 ~]#tr -d "[0-9]" 123vqadsa3241 vqadsa [root@centos7 data]#echo {a..z} >f1 [root@centos7 data]#cat f1 a b c d e f g h i j k l m n o p q r s t u v w x y z [root@centos7 data]#tr -d [f-m] <f1 a b c d e n o p q r s t u v w x y z
按列抽取文本cut和合并文件paste
- cut [OPTION]... [FILE]...
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段, 例如1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符[root@centos7 ~]#cat /etc/passwd | cut -d: -f1,3,7 root:0:/bin/bash bin:1:/sbin/nologin daemon:2:/sbin/nologin adm:3:/sbin/nologin lp:4:/sbin/nologin sync:5:/bin/sync shutdown:6:/sbin/shutdown halt:7:/sbin/halt mail:8:/sbin/nologin operator:11:/sbin/nologin games:12:/sbin/nologin [root@centos7 ~]#cat /etc/passwd | cut -c3-5 ot: n:x emo m:x :x: nc: utd lt: il:
cut和paste
- 显示文件或STDIN数据的指定列
cut -d: -f1 /etc/passwd 按:号切割,并取出第一列
cat /etc/passwd | cut -d: -f7 按:号切割,并取出第7列
cut -c2-5 /usr/share/dict/words 取出整个文件第2到第5个字符 - paste合并两个文件同行号的列到一列
用法:paste [OPTION]... [FILE]...
-d 分隔符:指定分隔符,两个文件中间以指定分隔符分隔开,默认用TAB
-s : 所有行合成一行显示
paste f1 f2 文件(横向)合到一块
paste -s f1 f2 所有行合成一行[root@centos7 ~]#paste f1 f2 aa aa bb bb vv cc dd dd xx ee [root@centos7 ~]#cat f1 aa bb vv dd xx [root@centos7 ~]#cat f2 aa bb cc dd ee [root@centos7 ~]#paste f1 f2 aa aa bb bb vv cc dd dd xx ee [root@centos7 ~]#paste -d: f1 f2 aa:aa bb:bb vv:cc dd:dd xx:ee [root@centos7 ~]#paste -s f1 f2 aa bb vv dd xx aa bb cc dd ee
1.2 分析文本的工具
- 文本数据统计:wc
- 整理文本:sort
- 比较文本:diff和patch
收集文本统计数据wc
- wc命令统计的内容分别是:单词总数、行总数、字节总数和字符总数
- 可以对文件或STDIN的数据运行
如:wc /etc/passwd
45 88 2311 /etc/passwd
行数 字数 字节数
注意:当文本中出现汉字时,一个汉字占3个字符,加上换行符,会多出4个字符(字符和字节不是同一概念) - 常用选项
-l:只计数行数
-w:只计数单词总数
-c:只计数字节总数
-m:只计数字符总数
-L:显示文件中最长行的长度[root@centos7 ~]#cat /etc/passwd |wc -l 45 [root@centos7 ~]#cat /etc/passwd |wc -w 88 [root@centos7 ~]#cat /etc/passwd |wc -c 2311 [root@centos7 ~]#cat /etc/passwd |wc -m 2311 [root@centos7 ~]#cat /etc/passwd |wc -L 99
文本排序sort
- 把整理过的文本显示在STDIN,不改变原始文件
用法:sort [options] file(s) - 常用选项:
-r:执行反方向(由上至下)整理
-R:随机排序
-n:执行按数字大小整理
-f:选项忽略(fold)字符串中的字符大小写
-u:选项(独特,unique)删除输出中的重复行
-t c:选项使用c做为字段界定符
-k X:选项按照使用c字符分隔的X列来整理能够使用多次
cat /etc/passwd |sort -t: -k3 -nr
取第3列uid进行从大到小排序
知识扩展:
seq 75 |sort -R |head -n1
随机从75个数中取出一个数字,数字75可自定义
uniq
- uniq命令:从输入中删除前后相接的重复的行
- uniq [OPTION]... [FILE]...
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
注:连续且完全相同方为重复 - 常和sort命令配合使用:
sort userlist.txt | uniq -c 去重并排序
知识扩展:
cat file1 file2 |sort |uniq -d
取两个文件的交集(重复的行)
比较文件diff
比较两个文件之间的区别
diff foo.conf foo2.conf
5c5
< use_widgets = no
\-\-\-
\> use_widgets = yes
* 注明第5行有区别(改变)
赋值对文件改变patch
- diff 命令的输出被保存在一种叫做“补丁(diff.log)”的文件中
* 使用-u选项来输出“统一的”diff格式文件,最适用于补丁文件 - patch 赋值在其他文件中践行的改变(谨慎使用)
* 使用-b选项来自动备份改变了的文件
$ diff -u foo.conf foo2.conf > foo.patch
$ patch -b foo.conf foo.patch
示例:
diff -u f1 f2 >diff.log
把比较结果重定向到diff.log文件中
patch 根据“补丁”文件(diff.log)还原源文件(f2)
rm -rf f1
删除f1文件
patch -b f1 diff.log
根据diff.log文件恢复f1文件
先备份f1文件并将该文件重命名为f1.orig
然后根据diff.log恢复f2文件,但f2文件恢复后被重命名为f1
因此恢复后,f1文件即为f2文件内容,f1.orig文件为f1文件内容
练习:
1、找出ifconfig “网卡名” 命令结果中本机的IPv4地址
ifconfig ens33|head -n2 |tail -n1|tr -s " "|cut -d" " -f3
2、查出分区空间使用率的最大百分比值
df |tr -s " " %|cut -d% -f5|sort -nr|head -n1
3、查出用户UID最大值的用户名、UID及shell类型
cat /etc/passwd |cut -d: -f1,3,7|sort -t: -k2 -nr|head -n1
4、查出/tmp的权限,以数字方式显示
stat /tmp |head -n4 |tail -n1|tr -dc [:digit:]|cut -c1-4
5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
netstat -nt|tr -s " " : |cut -d: -f6|tr -dc "[:digit:].\n"|sort|uniq -c|sort -nr
文章评论