关于 文本处理工具、正则表达式、grep 的简单举例

                          文本处理工具

抽取文本的工具

文件内容:less和cat

文件截取:head和tail

按列抽取:cut

按关键字抽取:grep

文件查看命令:cat,tac,rev

cat [选项] [file]

cat -n     对显示出的每一行进行编号

cat -b     非空行编号

cat -ns    连续压缩空行成一行

cat -v     显示回车符

cat -E     显示行结束符$

cat -A     显示所有控制符

tac file   反向显示内容

rev file   反向显示每一行

hexdump -C file  二进制字符显示内容

分页查看文件内容

more [选项] [file]

more -d 显示翻页及退出提示

less 一页一页的查看文件

/字符   搜索关键字符

n/N     跳到下一个或者上一个

less 命令是man 命令使用的分页器

显示文本的前行或者后行内容

head [选项] [file]

head -c 数字  指定获取文件前部分自定义数字的字节

head -n 数字  指定获取文件前部分自定义数字的行

head -数字   指定获取文件前部分自定义数字的行数

tail [选项] [file]

tail -c 数字  指定获取文件后部分自定义数字的字节

tail -n 数字  指定获取文件后部分自定义数字的行

tail -数字    指定获取行数后部分自定义数字的行数

tail -f /dir/dir

查看日志的状态

tail -n 0 -f /var/log/messages &

后台运行,监测日志的最新内容,直接显示终端上面,不影响正常工作

按列抽取文本cut和文件paste

cut [选项] [file]

cut -d: -f 1,2,3

-d指明分隔符比如以:为分隔符  默认tab

-f后面跟数字。显示某个数字的字段

多个字段,例如#,#[,#] 例如1,3,6

连续的多个字段,例如#-# 例如1-6

也可以混合使用,例如1-5,7

cut -c数字范围按字符切割;例如 cut -c55-56 file

–output-delimiter=指定输出分隔符  显示自定义分隔字符)

例如 cut -d: -f1-5 –output-delimiter=+ f1

练习

1找出ifconfig 命令结果中本机的ip地址

~]# ifconfig | head -2 | tail -1 | cut -d: -f2 |cut -d" " -f1

(命令)(管道接口|只显示前2行的内容,管道接口|显示后1行的内容,

管道接口|抽取以:为分隔符-f2字段的内容单独显示;

管道接口|抽取以“空格字符”为分隔符-f1字段的内容单独显示) 

2查出分区空间使用率的百分比值

~]# df |tail -5|tr ' ' ':'|tr -s ':'|cut -d: -f5

(命令)(管道接口|只显示文件的后5行内容;管道接口|用tr命令将文件内容中的'空格'替换成':'

管道接口|用tr -s将连续重复的字符统一压缩成一个字符;管道接口|抽取文件中以:为分隔符-f5第五个字段的内容显示)

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

paste [选项] [file]

paste -d  指定分隔符         例如 ~]# paste -d: f3 f4

paste -s  所有行合成一行显示 例如 ~]# paste -s f3 f4

paste file file 格式         例如 ~]# paste f3 f4

分析文本的工具

文本数据统计:wc

整理文本:sort

比较文件: diff 和 patch

收集文本统计数据wc

计数单词总数、总行数、字节的总数和字符的总数

      ]# wc f1

     18  79 883 f1

   行数;单词数;字符数; 文件

wc -l   只计数行数

wc -w   计数单词总数

wc -c   计数字节总数

wc -m   计数字符总数

文本排序sort

把整理过的文本显示出来,不改变原始文件

sort [选项] file

常用选项

sort -r  执行反方向(由上至下)的整理显示

sort -n  执行按数字大小整理显示

sort -f  选项忽略(fold)字符串中的字符大小写

sort -u  删除多余重复的字符

sort -t  使用某个字符做为字段界定符;比如使用-t:以:作为字段界定符

sort -k  选项按照使用c字符分隔的X列来中立能够使用多次

uniq 从输入中删除重复的前后相接的行

uniq [选项] [file]

uniq -c 显示每行重复出现的次数

uniq -d 仅显示重复过的行

uniq -u 仅显示不曾重复的行

连续并且完全相同方位重复

通常和sort 命令一起配合使用

sort file | uniq -c

比较两个文件之间的区别

diff [file] [file]

diff f1 f2  > bf.log 

比较两个文件的区别并重定向到一个文件中

复制对文件改变patch

diff 命令的输出被保存在一种叫做“补丁”的文件中

使用 -u 选项来显示出来更详细的变动内容

patch 命令复制在其他文件中进行的改变

使用 -b 选项来自动备份改变了的文件

diff f1 f2 -u > bf.log 

patch -b f1 bf.log 

先备份f1原有的文件内容,加-b选项后 会生成一个f1.orig的文件格式,这个是原先的f1

然后这个时候bf.log会变成f1文件,也就是恢复了原先的f2文件

练习

1查出用户UID最大值的用户名, UID级shell类型

~]# getent passwd |sort -t: -k3 -n |cut -d: -f1,3,7 |tail -1

(命令) (管道接口|-t选项以:为界定符的-k 第3列 -n按照数字大小整理排序)(抽出文本-d:为分隔符的-f 1,3,7字段的内容)(按照倒序1行显示)

2查出/tmp的权限,以数字方式显示

~]# stat /tmp | head -4 |tail -1 |tr " " "\n" |head -2 |tail -1 |tr -dc '[:digit:]'

~]# stat /tmp |head -4  |tail -1 |cut -d: -f2 |tr -dc '[:digit:]'

(命令) (正序显示前4行然后倒序显示后1行;抽取文本-d:为分隔符 -f 2字段的内容)(删除在补集引用数字的字符)

文本处理三剑客

grep 文本过滤工具

grep,egrep,fgrep(不支持正则表达式搜索)

sed  文本编辑工具

awk  文本报告生成器

grep

作用:文本搜索功能根据,更具用那个户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行

模式:由正则表达式字符及文本字符所编写的过滤条件

grep 自定义字符 路径 路径

可以搜索指定的字符,可以加上两个不同的路径来显示出来搜索结果

grep [选项] [自定义字符] [file]

grep root /etc/passwd

grep "$USER" /etc/passwd

grep '$USER' /etc/passwd

grep `whoami`/etc/passwd

alias grep='grep –color=auto' 对匹配到的文本着色显示。6版本需要设置,7版本默认

grep -v 显示不能被自定义字符匹配到的字符串

grep -i 忽略字符大小写

grep -n 统计匹配的行数

grep -c 统计匹配的行数

grep -o 仅显示匹配到的字符串

grep -q 静默模式,不输出任何信息

grep -A ##自定义数字。后几行

grep -B ##自定义数字,前几行

grep -C ##自定义数字,前后各几行

grep -e 实现逻辑或和与,比如取root或者bash的行 grep -e root -e bash /etc/passwd;   

          例如,包括root并且bash, grep root /etc/passwd | grep bash

grep -w 整行匹配整个单词

grep ‘自定义字符’ 默认搜索关键字

正则表达式

由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能

程序支持:grep,vim,less,nginx等

正则表达式分为两类

基本正则表达式:BRE

扩展正则表达式: ERE   grep -E = egrep

正则表达式引擎:采用不同的算法,检查处理正则表达式的软件模块

元字符分类:字符匹配、匹配次数、位置锚定、分组

基本正则表达式元字符

字符匹配:

.      匹配任意单个字符

[]     匹配指定范围内的任意单个字符

[^]    匹配指定范围外的任意单个字符

[:alnum:] 表示所有的字母和数字

[:alpha:] 表示左右的字母不区分大小写

[:digit:] 表示所有的数字

[:lower:] 表示所有的小写字母

[:punct:] 表示所有的标点符号

[:space:] 表示所有的空白字符

[:upper:] 表示所有的大写字母

次数匹配:用于要指定次数的字符后面,用于指定前面的字符要出现的次数

*:匹配前面的字符任意次,包括0次;贪婪模式:尽可能的匹配能匹配多少。

.*:任意长度的任意字符

\?: 匹配其前面的字符0或1次

\+: 匹配其前面的字符至少1次

\{n\} 匹配前面的字符n次

\{m,n\} 匹配前面的字符至少m次,至多n次

\{,n\}  匹配前面的字符至多n次

\{n,\}  匹配前面的字符至少n次

位置锚定:对特定位置进行定位显示

^ :行首锚定,用于模式的最左侧

$ :行尾锚定,用于模式的最右侧

^自定义字符$ :用于匹配到整行

^$ :空行

^[[:space:]]*$ :空白行

\<或\b :词首锚定,用于单词模式的左侧

\>或\b :词尾锚定,用于单词模式的右侧

\<自定义字符\>  :匹配整个单词

分组:分组是至将一个或多个字符捆绑在一起,当作一个整体进行处理,其符号为\(\):

如:\(root\)\+

rootrootroot

将三个root分组\(root\) \+表示重复一次以上

分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,…

\1: 从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符

\2: 从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符

例如 \(ab\+\(xy\)*\)中\1表示 ab\+\(xy\)* \2表示 xy

后向引用:引用钱面的分组括号中的模式所匹配的字符,而非模式本身

egrep及扩展的

正则表达式

egrep = grep -E

egrep [选项] [自定义字符] [file]

扩展正则表达式的元字符:

字符匹配:

.   任意单个字符

[]  指定范围的字符

[^] 不在指定范围的字符

次数匹配:

*    匹配前面字符任意次 

?   0或1次

+    1次或多次

{m}  匹配m次 

{m,n} 至少m,至多n次

位置锚定

^   行首

$   行尾

\<,\b  语首

\>,\b  语尾

分组

()

后向引用

\1,\2,…

或者:

a|b

C|cat C或cat

(C|c)at Cat 或cat

扩展正则表达式的使用语法

grep -E '自定义字符' file

egrep '自定义字符' file 

练习

1显示三个用户root,xiaomage,makangbo的UID和默认shell类型

egrep "^(root|xiaomage|makangbo):" /etc/passwd | cut -d: -f3,7

(扩展正则表达式用“”引用表达式元字符^取开头为某字符的字段;后面跟文件路径)

(管道接口|-d抽取分隔符为:的字段 -f 定义第3,7个字段为结果)

 

2 找出/etc/rc.d/init.d/functions 文件中行首为某单词(包括下划线)后面跟一个小括号的行 

~]# cat /etc/rc.d/init.d/functions | egrep -o "^[[:alnum:]_]+\(\)"

(查看文件路径内容;管道接口|扩展正则表达式加-o选项仅显示匹配到的字符 

“”引用^开头为所有字母和数字,并且带有下划线和分组为括号的字段显为显示结果)

3使用egrep取出/etc/rc.d/init.d/functions中基名

 ~]# echo "/etc/rc.d/init.d/functions" | egrep -o "[^/]+?$"

(回显命令 文件路径内容 ;管道接口|扩展正则表达式 -o选项仅显示匹配到的字符 

“”引用[^/]匹配知指定范围外的任意单个字符,+匹配前面的字符至少一次?任意字符$匹配字符结尾)

4 显示/etc/passwd 文件中不以/bin/bash结尾的行

~]# grep -v /bin/bash$ /etc/passwd

 (正则表达式-v选项显示不能被匹配到的行,不匹配以/bin/bash$为结尾的字符,,后面跟文件路径)

5 显示rpc默认的shell程序

 ~]# grep -w "\<rpc" /etc/passwd |cut -d: -f7

 (命令加-w选项,整行匹配整个单词。引用词首锚定\<为rpc 后面跟上文件路径)

 (抽取文本-d:为分隔符的 定义-f7的字段内容为显示结果)

6 找出/etc/passwd 中的两位或三位数

~]# grep "[0-9][0-9][0-9]\?" /etc/passwd

(命令 引用[数字范围]\? 匹配前面的字符0次或1次,就是前面的可有可无 后面跟文件路径)

7显示 /etc/grub2.cfg 文件中,至少以一个空白字符开头的,并且后面存在费空白字符的行

~]# grep "^[[:space:]\+[^[:space:]]" /etc/grub2.cfg

(命令引用^开头为空白字符的\+匹配最少一次[^[非空白结尾的字符行 后面跟文件路径)

8找出‘netstat -tan’命令结果中以'LISTEN'后跟任意多个空白字符结尾的行

~]# netstat -tan  | grep "LISTEN[[:space:]]*$"

(命令  管道接口|正则表达式引用LISTEN之后跟空白字符*匹配任意次$行尾锚定)

 

9 添加用户bash,testbash,basher,nologin (shell为/sbin/nologin)而后找出/etc/passwd文件中用户名同shell的行

~]# grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd

(命令引用^行首锚定,分组所有字母数字\{1,\}匹配前面的字符至少一次 .*匹配任意长度的任意字符 \1后向引用 $行尾锚定  后面跟文件路径)

  

不管什么命令,要学会灵活使用,有的时候搭配在一起会让人有意想不到的结果,比如 rm -rf /   关于 文本处理工具、正则表达式、grep 的简单举例

原创文章,作者:小马哥,如若转载,请注明出处:http://www.178linux.com/31336