6-1 文本处理工具和正则表达式

Posted kjalbert

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6-1 文本处理工具和正则表达式相关的知识,希望对你有一定的参考价值。

文本处理工具和正则表达式

cat命令

cat [OPTION]...[FILE]...
查看文本文件,不能使用cat查看二进制文件,否则会乱码
什么选项都不加时,默认接受标准输入,并输出在屏幕上
可以接受标准输入 cat < a.txt
默认看不到回车,tab等不可见符号

cat -E              #显示行结束符$  
cat -A              #可以查看tab和回车键
vim: set ff=dos     #vim中设置文件格式位windows文本格式  
cat -n              #显示行号,空行也显示行号  
cat -b              #显示行号,空行不显示行号  
cat -s              #压缩相邻的空行  

tac命令

与cat相反,把文件按照相反方向显示,以行为单位

nl命令

显示行号,类似于cat -b

rev命令

rev FILE将整行反转,行本身仍然按照顺序显示

hexdump命令

hexdump -C -n 512 /dev/sda 查看sda硬盘的前512字节

od,xdd也都是查看二进制文件的命令

more命令

分页显示文本文件内容的,回车一行一行,空格翻页

less命令

一页一页地查看文件或STDIN输出
man命令就是使用less,可以翻页,搜索等
/TXT 用来搜索对应文本,使用n跳转下一个N跳转上一个

less和more都支持配合管道命令分页显示

head命令

head FILE                                       #显示前十行  
head -c$ FILE                                   #显示前$个字节 
head -n$ FILE                                   #显示前$行
head -$ FILE                                    #显示前$行 
cat /dev/urandom |tr -dc '[:alnm:]'|head -c10   #利用urandom设备产生的随机数,过滤出前十个数字和字母,作为随机密码

tail命令

显示后几行,默认10行,-f监测文件变化,-f跟踪文件描述符,-F跟踪文件名

tail FILE                                       #默认显示文件的最后10行
tail -c$                                        #显示最后的$个字节
tail -n$ 或 tail -$                             #显示最后的$行
tail -f                                         #跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor
tail -F                                         #跟踪文件名,相当于 --follow=name --retry
tailf                                           #类似tail -f,当文件不增长时并不访问文件

由于passwd是创建新文件然后覆盖的,所以f跟踪不到,F可以跟踪

cut命令

按列抽取文本命令

cut -d DELIMITER                                #指明分隔符,默认tab
cut -f FILEDS                                   #指定显示的字段
cut -f @                                        #指定显示第@列
cut -f @,@                                      #指定显示第@和第@段
cut -f @-@                                      #指定显示@到@列
cut -f @-@,@                                   #混合使用
cut -c                                          #按字符切割
--output-delimiter=STRING                       #指定输出分隔符
cut -d: -f3 /etc/passwd                         #例子:以:为分隔符,切割/etc/passwd文件,取出其中第三列

paste命令

合并两个文件同行号的列到一行

paste FILE1 FILE2
paste -d                                        #指定分隔符,默认用tab
paste -s                                        #所有行合成一行显示

paste a.log b.log将同一行合成
paste -b转换方向,可以使用-d指定分隔符

wc命令

统计文件的行数,单词数,字节总数和字符总数
也可以单独统计某些内容

wc -l                                           #只计数行数
wc -w                                           #只技术单词总数
wc -c                                           #只技术字节总数
wc -m                                           #只技术字符总数
wc -L                                           #显示文件中最长行的长度

sort命令

文本排序,同样支持标准输入

sort FILE
sort -r                                         #执行反方向(由上至下)整理
sort -R                                         #随机排序
sort -n                                         #执行按数字大小整理
sort -f                                         #选项忽略(fold)字符串中的字符大小写
sort -u                                         #选项(独特,unique)删除输出中的重复行
sort -t c                                       #选项使用c作为字段界定符
sort -k @                                       #选项按照使用c字符分割的@列来整理能够使用多次
sort -t: -k3                                    #指定冒号作为分隔符,以第三列排序  
默认以字符排序,-n才是数字排序的效果
例子:  
df |tr -s " " % |cut -d% -f5 |sort -nr  
seq 55 |sort -R|head -n1取随机数  
echo $[RANDOM%55+1]  
cat /dev/urandom |tr -dc '[:digit:]' |head -c2  

uniq命令

uniq标识独特单一的意思,命令的作用就是将相邻的重复行压缩成一行

uniq -c                                         #显示重复的次数  
uniq -d                                         #仅显示重复的行  
uniq -u                                         #仅显示不曾重复的行
# 注:连续且完全相同方为重复  
sort FILE |uniq -c                              #统计合并的行  
sort FILE |uniq -c |sort -nr                    #可以查看文件中比如登陆日志中链接次数最多的ip等

diff命令,patch命令

比较两个文件的不同

diff -u FILE1 FILE2 >diff.patch                 #可以更加详细的不同信息,并输出补丁文件
diff -b                                         #选项自动备份文件
patch -b FILE1 diff.patch                       #即可将补丁打上,恢复出原来的文件  

ss命令

可以查看网络连接数和一些细节

Linux文本处理三剑客之grep

文本三剑客小介绍

grep:文本过滤工具
sed:stream editor文本编辑工具
awk:Linux上的实现gawk,文本报告生成器

grep命令

grep:文本锅炉(模式:pattern)工具
grep,egrep,fgrep(不支持正则表达式搜索)
每次读入一行,符合条件就打印,不符合就继续读下一行,直到读取完整个文件
支持标准输入
$USER当前用户名

grep --color=auto                           #对匹配到的文本着色显示
grep -m$                                    #显示符合条件的前$行,或者说匹配$行就停止  
grep -v                                     #反向匹配  
grep -i                                     #忽略大小写  
grep -n                                     #加上行号  
grep -c                                     #统计匹配行数  
grep -o                                     #将符合条件的字符串显示出来  
grep -q                                     #不显示结果  
grep -A$                                    #显示符合条件的后$行  
grep -B$                                    #显示符合条件的前$行  
grep -C$                                    #显示符合条件的前后$行  
grep -e                                     #实现多个选项之间的逻辑or关系
grep -w                                     #匹配整个单词
grep -E                                     #使用扩展正则表达式,egrep
grep -F                                     #相当于fgrep,不支持正则表达式
grep -f FILE                                #根据模式文件处理

正则表达式

不是所有命令支持正则表达式
不支持的可以通过管道和grep来使用正则表达式过滤
REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
程序支持:vim, less,grep,sed,awk, nginx,varnish 等 ?分两类:

  • 基本正则表达式:BRE,grep,vim
  • 扩展正则表达式:ERE,grep -E, egrep,nginx

正则表达式引擎:

  • 采用不同算法,检查处理正则表达式的软件模块
  • PCRE(Perl Compatible Regular Expressions)

元字符分类:字符匹配、匹配次数、位置锚定、分组
man 7 regex可以查看手册
匹配规则

字符匹配:
.                           //匹配任意单个字符
[]                          //匹配指定范围内的任意单个字符,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^]                         //匹配指定范围外的任意单个字符
[:alnum:]                   //字母和数字
[:alpha:]                   //代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:]                   //小写字母 [:upper:] 大写字母
[:blank:]                   //空白字符(空格和制表符)
[:space:]                   //水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:]                   //不可打印的控制字符(退格、删除、警铃...)
[:digit:]                   //十进制数字 [:xdigit:]十六进制数字
[:graph:]                   //可打印的非空白字符
[:print:]                   //可打印字符
[:punct:]                   //标点符号


匹配次数:
//用在要指定次数的字符后面,用于指定前面的字符要出现的次数
*                           //匹配前面的字符任意次,包括0次
.*                          //任意长度的任意字符
\?                          //匹配其前面零次或一次
\+                          //匹配其前面的字符出现至少一次  
\n\                       //匹配前面字符出现n次
\n,m\                     //匹配前面的字符至少n次,至多m次
\,m\                      //匹配前面的字符最多m次
\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(后向引用)的反斜线,其他的反斜线都去掉

以上是关于6-1 文本处理工具和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Linux篇 | 文本处理工具和正则表达式

Shell正则表达式和文本处理工具

正则表达式和文本处理工具

grep文本处理工具正则表达式

文本处理工具grep,egrep和正则表达式的使用

Linux文本处理工具和正则表达式