文本处理工具

  • 各种文本工具、分析、统计文本
  • grep
  • 正则表达式
  • 扩展正则表达式

抽取文本的工具

文本内容:less和cat   
文件截取:head和tail   
按列抽取:cat   
按关键字抽取:grep   

文件内容查看

  • 文件查看命令:
    • cat nl tac rev
cat [OPTION]...[FILE]...
    -E:显示行结束 $
    -n:显示出每一行进行编号
    -A:显示所有控制符
    -b:非空行编号
    -s:压缩连续的空行成一行
    
nl  加行号
tac 将行倒序
rev 将同一行倒序显示
    • 查看非文本命令(二进制):
    • hexdump od xxd
hexdump   -C 
od
xxd
    • 分页查看文件内容:
    • more less
more:分页查看文件
    more[OPTION...]FILE
        -d:显示翻页及退出提示
less:一页一页地查看文件或STDIN输出
查看时有用的命令包括:
    /文件搜索  文本
    n/N  跳到下一个 或者上一个匹配
less 命令是man命令使用的分页器
  • 显示文本前或后行内容:
    • head tail tailf
head [OPTION...]FILE
    -cN 指定获取前N字节
    -nN 指定获取前N行
    -N 指定行数

例:cat /dev/urandom |tr -dc '[:alnum:]' |head -c12
    生成随机字符串
- tail [OPTION]...[FILE]...
    -cN 指定获取后N字节
    -nN 指定获取前N行
    -N  指定行数
    -f  跟踪显示文件呢fd(文件描述符)新追加的内容,常用于日志监控
        相当于 --follow=name--retry
    -F  跟踪文件名,相当于--follow=name--retry

tailf 类似于tail -f,当文件不增长时并不访问文件 
  • 按列抽取文本cut和合并文件paste
cut [OPTION]...[FILE]...
    -d delimiter:指明分隔符,默认tab
    -f fileds:
        N:第N个字段
        N,N[,N]:离散的多个字段,例如1,3,6
        N-N:连续的多个字段,例如1-6
        混合使用:1-3,7
    -c 按字符切割
    --output-delimiter=STRING指定输出分隔符
    
例:cut -d: -f1,3 /etc/passwd
    取出/etc/passwd的用户名和UID
    
    df|cut -c45-47
    取出磁盘空间利用率
    
    ifconfig ens33 | head -2 | tail -l|tr -s ' '|cut -d' ' -f3 
    取ifconfig的ip地址
  • cut和paste
显示文件或STDIN数据的指定列
    cut -d:-f1 /etc/passwd
    cat /etc/passwd|cut -d: -f7
    cut -c2-5 /usr/share/dict/words

paste合并两个文件同行号的列到一行
paste [OPTION]...[FILE]...
    -d 分隔符:指定分隔符,默认用TAB
    -s: 所有行合成一行显示
例:
    paste f1 f2
    paste -s f1 f2 

2分析文本的工具

  • 文本数据统计:wc
  • 整理文本:sort
  • 比较文件:diff和patch
2.1收集文本统计数据wc
计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN中的数据运行
wc story.txt
39    237   1901  story.txt
行数 字数  字节数

常用选项:
	-l 只计数行数
	-w 只计数单词总数
	-c 只计数字节数
	-m 只计数字节总数
	-L 显示文件中最长行的长度
2.2文本排序sort
把整理过的文本显示在STDOUT,不改变原始文件
	sort [options]file(s)
常用选项:
	-r	执行反方向(由上至下)整理
	-R	随机排序
	-n 	执行按数字大小整理
	-f	选项忽略(fold)字符串中的字符大小写
	-u 	选项(独特,unique)删除输出中的重复行
	-t c 选项使用c作为字段界定符
	-k X 选项按照使用c字符分割的X列来整理能够使用多次

例: seq 10 |sort -R|head -1
2.3 唯一 uniq
uniq命令:从输入中删除前后相接的重复的行
uniq[OPTION]...[FILE]...
	-c:显示每行重复出现的次数
	-d: 仅显示重复的行
	-u: 仅显示不曾重复的行
	注:连续且完全相同方为重复

常和sort命令一起配合使用:
	sort userlist.txt | uniq -c 
	
lastb -f file|tr -s " "|cut -d" " -f3|sort|uniq -c|sort -nr|head
检索服务器访问量 

2.4 比较文件 diff
比较两个文件之间的区别
diff foo.conf foo2.conf 
5c5
< use_widgets = no 
---
> use_widgets = yes
注明第5行有区别(改变)

复制对文件改变patch
diff  命令的输出被保留在一种叫做"补丁"的文件中
	  使用 -u 选项来输出"统一的(unified)"diff格式文件,最适用于补丁文件

patch 复制在其他文件中进行的改变(要谨慎使用)
	  适用 -b 选项来自动备份改变了的文件
	  
例:  diff -u foo.conf foo2.conf > foo.patch 
	  patch -b foo.conf foo.patch 

面试题:取出两个不同目录中相同的文件列表:

方法一:
[root@centos7 ~]#ls /root > /tmp/root.log
[root@centos7 ~]#ls /data > /tmp/data.log
[root@centos7 data]#grep -vf /tmp/data.log /tmp/root.log

方法二:
[root@centos7 ~]#sort /tmp/data.log /tmp/root.log | uniq -u

方法三:
[root@centos7 ~]#( ls /root ;ls /data ) | sort |uniq -u