【128】
文本查看、分析、统计
1. 文件查看
1.1 cat命令说明**
格式
cat [option]…[file]…
应 用
主要功能连接文件,标准输入,标准输出
选 项
-A:相当于-vET的整合选项,可列出一些特殊符号
-n:对显示出的每一行进行编号
-E:显示行结束符$
-b:非空行编号
-s:压缩连续的空行成一行
例:显示文件/etc/issue的特殊字符,[tab]会以^I表示,断行字符则是以$表示, Windows中的断字符^M$。
[root@hai6 ~]$cat -A /etc/issue
ICentOS release 6.10 (Final)$
Kernel r on an m$
n l t$
v$
1.2 tac命令说明
格式
tac [option]…[file]…
功能
功能与cat相似,输出结果由最后一行到第一行方向在屏幕上显示出来
1.3 nl命令说明
命 令
nl [option]…[file]…
功能
可以将输出的文件自动加上行号
选 项
-b:指定行号,空行不显示
-ba:列出空行行号
-n:列出行号的表达方式后面跟ln、rn、rz三种表达方式
-w:行号字段的占用字符数,后跟数字
1.4 rev命令说明
命令:rev
功能:将文件中的每行内容以字符我单位反序输出,即第一个字符最先输出。
2. 分页查看文件内容
2.1 命令more
命令格式
more [options…] file…
功能
将文件在屏幕中分页显示,解决文件过长看不到开始的问题
2.2 命 令less
- 功能
将文件在屏幕中分页的过滤器,比more增加了回翻功能
3. 文件选择查看
3.1 命令head
命令格式
head [option]…[file]…
功能
显示文件的前几行,默认为10行
选 项
-c#:指定获取前#字节
-n#:指定获取前#行
-# :指定行数,可以为负数,意思为后面的#行不显示出来
3.2 命令tail
命令格式
tail [option]…[file]…
功能
显示文件的后几行,默认为10行
选 项
-c#:指定获取后#字节
-n#:指定获取后#行
-# :指定行数
-f : 跟踪显示文件fd新追加的内容,常用日志监控,相当于 - -follow=descriptor
-F:跟踪文件名,相当于- -follow= name - -retry
PS1:命令tailf类似tail-f,当跟踪文件没有更新是,不访问文件,节省资源
4.文件抽取与合并
4.1 命令cut
命令格式
cut [option]…[file]…
应 用
标准输出文件内容,分解数据
选 项:
-d DELIMITER:指定分隔符,默认tab,与-f一起使用
-f fieds:(f#) 第#个字段,(f#,#,#)离散的多个字段,(f#-#)连续的多个字段,例如1-6
混合使用例如1-3,7
-c :按字符切割
-output-delimiter=STRING 指定输出分隔符
示例
按字符切割,可以选择区间,也可以单独第几个字符后
[root@hai6 ~]$cut -c 15-20 /etc/passwd
t:/roo
/bin:/
4.2 paste
命令格式
paste [option]…[file]…
应 用
合并两个文件同行号的列到一行
选 项
-d分隔符:指定分隔符,默认用tab
-s :所有行合成一行显示
4.3 命令grep
命令格式
grep [option] PATTERN [file]…
功能
文本搜索工具,根据用户指定模式对目标文本逐行进行匹配检查,打印匹配到的行
选 项
–color=auto:对匹配到的文本着色显示,centos7默认已经定义了别名
-v:显示不被pattern匹配到的行
-i:忽略字符大小写
-n:显示匹配到的行号
-c:统计匹配到的行数
-f:指定规则文件,查找符合规则条件的文件内容,格式为每行一个规则样本
-o:仅显示匹配到的字符串
-q:静默模式,不输出任何信息,判断是否找到使用标识符
echo $,找到显示为0,找不到显示非0
-A#:后#行,用于想要搜索结果行没有明显关键字,
利用前后标识,指向搜索结果
-B#:前#行
-C#:前后各#行
-e:实现多个选项间的逻辑or关系 grep -e ‘cat’ -e ‘ dog’ file
-w:匹配整个单词
-E:使用ERE
-F:相当于fgrep,不支持正则表达式
示例
示例1:1-100里有多少个数字包含9
[root@V9centos7 ~]$seq 100|grep -c 9
19
示例2:显示文件f1和f2的交集。利用-f选项,空格也算不同规则,所以不匹配。
[root@V9centos7 ~]$cat -A f1
abc cba$
help $
exit$
wc$
[root@V9centos7 ~]$cat -A f2
abc cba$
help$
passwd$
wc$
[root@V9centos7 ~]$grep -f f1 f2
abc cba
wc
5 分析文本工具
5.1 命令wc
格式
wc [option]…[file]…
应 用
计算文件的byte数、字数或列数
选 项
-c :只显示字节数
-l :只显示列数
-w :只显示单词数
-m :只显示字符数
-L :显示文件中最长行的长度
示例
如图所示,三个字段从左向右分别为行、字数、字符数
[root@V9centos7 ~]$cat /etc/passwd|wc
49 96 2505
5.2 命令sort
命令格式
sort [option]…[file]…
应 用
将文件排序,将结果标准输出
选 项:
-r :执行反方向整理
-R :随机排序
-n :执行按数字大小整理
-f :选项忽略字符串中的大小写
-u :删除输出中的重复行
-t c:使用c作为字段界定符(这里只是用c表示一下,可替换)
-k x:按照使用c字符分隔的x列来整理能够使用多次
示例
将/etc/gtoup的GID按从小到大排列,示例中以:为分隔符取第三列,按数字排序
[root@V9centos7 ~]$sort -n -k3 -t: /etc/group
root:x:0:gentoo
bin:x:1:gentoo
daemon:x:2:
sys:x:3:
5.3 命令uniq
命令格式
uniq [option]…[file]…
应用
从输入中删除青后详解的重复行
选 项:
-c :显示每行重复出现的次数
-d :仅显示重复过的行
-u :仅显示没重复过的行,连续且完全相同为重复
6. 文件比较
6.1 命令diff
命 令
diff [option]…[file]…
应 用
比较给定的两个文件的不同,如果是目录,比较该目录中具有相同文件名的文件,而不会对子目录文件进行比较
选 项
-u:输出统一的diff格式文件,适用于补丁文件
6.2 命令path
格式
patch [option]…[file]…
应 用
让用户利用设置修补文件的方式,修改,更新原始文件
选 项
-b:备份每一个原始文件
示例
利用diff与patch进行文件备份复原,diff比较文件f1,f2,生成diff格式补丁文件f3
'1:比较f1、f2两文件将输出结果导入文件f3'
[root@V9centos7 ~]$diff -u f1 f2>f3
[root@V9centos7 ~]$cat f3
--- f1 2018-08-01 20:56:55.853020328 +0800
+++ f2 2018-08-01 20:57:51.344020475 +0800
@@ -1,4 +1,4 @@
abc cba
-help
-exit
+help
+passwd
wc
'2:文件f2内容'
[root@V9centos7 ~]$cat f2
abc cba
help
passwd
wc
'3:将文件f2删除'
[root@V9centos7 ~]$rm f2
rm: remove regular file ‘f2’? y
'4:输入命令path以f1为源文件,输入补丁文件f3,还原f2(生成文件名为f1),原文件变为f1.orig'
[root@V9centos7 ~]$patch -b f1<f3
patching file f1
[root@V9centos7 ~]$cat f1
abc cba
help
passwd
wc
1、awk简介
awk是一个强大的文本分析工具,也可以说是Linux下一门字符串处理语言,它的数据可以来自标准输入(stdin)、一个文件或多个文件、或其他命令的输出。它可以作为命令使用,但更多的是作为脚本使用。
它支持正则表达式、支持自定义变量(类map型数组,只不过索引可以是字符串)、支持内置变量、内置函数、及流程控制语句。
它会依次读取文件的每一行内容, 然后对其进行处理。空格符和制表符为其默认的分割符,使用分割符号对每行进行切片,然后对切开部分进行单独的处理。
2、awk参数
支持自定义分隔符
支持正则表达式匹配 (标准正则)
支持自定义变量,数组 a[1] a[tom] map(key)
支持内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数 本行总列数
NR 已读的记录数 行号
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
控制记录分隔符 支持函数 print、split、substr、sub、gsub
支持流程控制语句,类C语言 if、while、do/while、for、break、continue
$0 代表整个记录,$1表示第一个字段,$2表示第二个字段,一次类推。。。。
按:切割a.txt文件,打印第一列
awk -F':' '{print $1}' a.txt
按:切割a.txt文件,打印第一列和第七列,tab键分隔
awk -F':' '{print $1 "t" $7}' a.txt
按:切割a.txt文件,打印第一列和第七列,表头追加name和shell,表尾追加over,字段间tab键分隔
awk -F':' 'BEGIN{print "nametshell"} {print $1 "t" $7} END{print "over"}' a.txt
打印含root单词的行
awk '/root/ {print $0} ' a.txt
打印含root单词的行后,再打印所有行(搜索值作用于第一个函数)
awk '/root/ {print $0} {print $0} ' a.txt
打印文件每行的信息,最前方追加行号和该行总列数,用tab键分隔
awk -F':' '{print NR "t" NF "t" $0}' a.txt
报表统计:
数据
统计报表:合计每人1月工资,0:manager,1:worker
Tom 0 2012-12-11 car 3000
John 1 2013-01-13 bike 1000
vivi 1 2013-01-18 car 2800
Tom 0 2013-01-20 car 2500
John 1 2013-01-28 bike 3500
统计01月员工工资
awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5}} END{for(i in name){print i "t" name[i]}}' a.txt
统计01月员工工资,员工类型为0,末尾追加M,为1末尾追加W
awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5};if($2=="0")
{role[$1]="M"}else{role[$1]="W"}} END{for(i in name){print i "t" name[i] "t" role[i]}}' a.txt