文本处理工具基础应用

                                                                          文本处理工具


文本工具

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

cat:连接文件并显示到标准输出设备上

选项

-E:显示行结束符$

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

-A:显示所有控制符

-b:非空行编号

-s:压缩连续的空行成一行

[root@localhost ~]# cat -n a ==>编号
     1	aaaaa
     2	
     3	
     4	eeeee
[root@localhost ~]# cat -E a ==>行结束符
aaaaa$
$
$
eeeee$
[root@localhost ~]# cat -A a ==>所有控制符
aaaaa$
$
$
eeeee$
[root@localhost ~]# cat -sn  a ==>压缩连续空行并编号
     1	aaaaa
     2	
     3	eeeee
[root@localhost ~]# cat -b  a ==>非空行编号
     1	aaaaa


     2	eeeee

tac:将文件以行尾单位反序输出 ==>和cat相反

[root@localhost ~]# cat a
aaaaa


eeeee
[root@localhost ~]# tac a ==>反序输出
eeeee


aaaaa
[root@localhost ~]#

rev:将文件的每行内容以字符为单位反序输出,即第一个最后输出,最后一个字符最先输出,依次

[root@localhost ~]# cat b
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]# rev b
01 9 8 7 6 5 4 3 2 1   ==>注意是以字符为单位反序输出

more:分页查看文件 ==>只能向前浏览

常用翻页快捷键:

space :每次翻一屏

enter:每次翻一行

b:显示上一屏内容

q:退出

less:和more相似 

常用翻页选项

PageUp:向上翻一行,

PageDown:向下翻一行

space :每次翻一屏

enter:每次翻一行

/pattern:搜索关键字

n/N:跳到上一个或者下一个关键字

head:显示文件前#行,默认显示10行

tail:显示文件的后#行。默认10行

[root@localhost ~]# cat a
aaaaa
11111
22222
eeeee
55555
66666
00000
[root@localhost ~]# head -3 a ==>显示前三行
aaaaa
11111
22222
[root@localhost ~]# tail -3 a ==>显示后三行
55555
66666
00000

选项:

-c #:指定获取前或后#字节

-n #:指定获取前或后#行

-# :指定行数

-f:跟踪显示文件新追加的内容,常用于日志监控

日志监控:tail -n 0 -f  /var/log/messages  只显示新日志信息,其他不显示

cut:显示行中的指定部分,删除文件中指定字段

-d 分隔符 :指明分隔符,默认tab

-f 字段:

   #:第#个字段

  #,#,#:离散的多个字段

   #-#:连续的多个字段

-c:按字符切割

简单实用案例

显示用户wangcai 默认的shell 程序

[root@localhost ~]# getent passwd wangcai
wangcai:x:4325:4325::/home/wangcai:/bin/bash
[root@localhost ~]# getent passwd wangcai|cut -d: -f7 ==>以:为分隔符,第七个字段就是shell
/bin/bash

paste:将多个文件按照队列进行合并

-d:指明分隔符,默认tab

-s:所有行合并一行显示

[root@localhost ~]# paste -d: a b ==>使用分隔符:来按照队列合并
aaaaa:
11111:1 2 3 4 5 6 7 8 9 10
22222:x c v b e r t y q qw
eeeee:
55555:
66666:
00000:
[root@localhost ~]# paste -s a b  ==>合并成一行显示
aaaaa	11111	22222	eeeee	55555	66666	00000
	1 2 3 4 5 6 7 8 9 10	x c v b e r t y q qw

wc:单词统计,显示单词字节行数

-c:显示字节

-l:显示行

-w:单词

[root@localhost ~]# cat -A a
aaaaa$
11111$
22222$
eeeee$
55555$
66666$
00000$
[root@localhost ~]# cat a |wc 
      7       7      42        ==>7行,7个单词,42个字节

sort:将文件排序,并将文件排序结果标准输出

-r:执行反向(由上至下)整理

-n:执行案数字排序

-f:选项忽略(fold)字符串的字符大小

-u:选项(独特,unique)删除输出中的重复行

-t c:选项使用做字段界定符

-k x:选项按照使用c字符分隔的x列来整理能够使用多次

[root@localhost ~]# sort -r a ==>方向排序
66666
55555
11111
00000


[root@localhost ~]# sort -n a ==>数字排序


00000
11111
55555
66666
[root@localhost ~]# sort -u a ==>删除重复行

00000
11111
55555
66666

以上为简单列子,实际运用后面作业里会详细说明

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

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

-d:仅显示重复过的行

-u:仅显示不重复的行

连续且完全相同为重复

[root@localhost ~]# uniq -c a ==>重复行出现次数
      1 11111
      2 
      1 55555
      1 66666
      1 00000
[root@localhost ~]# uniq -d a ==>仅显示重复行

[root@localhost ~]# uniq -u a ==>仅显示不重复行
11111
55555
66666
00000

diff:逐行比较文件的不同之处

[root@localhost ~]# ll hah/ ==>文件1,2,3
total 8
-rw-r--r-- 1 root root 6 Aug  5 20:41 1
-rw-r--r-- 1 root root 6 Aug  5 20:41 2
-rw-r--r-- 1 root root 6 Aug  5 20:40 3
[root@localhost ~]# ll heh/ ==>文件3,4,5
total 0
-rw-r--r-- 1 root root 0 Aug  5 20:40 3
-rw-r--r-- 1 root root 0 Aug  5 20:40 4
-rw-r--r-- 1 root root 0 Aug  5 20:40 5
[root@localhost ~]# diff heh  hah
Only in hah: 1
Only in hah: 2  ==>比较目录下相同文件名的文件,不会对目录中的文件进行比较
Only in heh: 4
Only in heh: 5

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

    使用 -u 选项来输出“统一的(unified )”diff 格式文 件,最适用于补丁文件。

      

patch 命令复制在其它文件中进行的改变(要谨慎使用!)

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

$ diff -u foo.conf-broken foo.conf-works > foo.patch

$ patch -b foo.conf-broken foo.patch

文本处理三剑客:

grep :(global search regular expression(RE) and print out the line

       文本搜索工具,根据用户指定的”模式“对目标文本逐行进行匹配检查,显示匹配到的行

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

选项:

–color=auto:对匹配到的文本着色显示; ==>centos7上以定义别名alias grep='grep –color=auto'

-v:显示不能被模式匹配到的行

-i:忽略字符大小写

-n:显示匹配到的行号

-c:统计匹配的行数

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

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

-A #:after,显示后#行

-B #:before, 显示前#行

-C #:context,前后各#行

-e:实现多个选项间的逻辑er关系

     grep –e ‘cat ’ -e ‘dog’ file

-w:整行匹配整个单词

-E:支持ERE(扩展正则表达式)

[root@localhost ~]# cat a

11111
AAAAA
aaaaa
55555
66666
00000
[root@localhost ~]# grep -i 'a' a   ==>忽略大小写,匹配到aaaaa和AAAAA
AAAAA
aaaaa
[root@localhost ~]# grep -c 'a' a   ==>匹配到一次
1
[root@localhost ~]# grep -ci 'a' a  ==>匹配到两次
2
[root@localhost ~]# grep -o 'a' a   ==>仅显示匹配的内容
a
a
a
a
a
[root@localhost ~]# grep -oi 'a' a  ==>仅显示匹配的内容
A
A
A
A
A
a
a
a
a
a
[root@localhost ~]# cat a|grep -A2 "a" ==>匹配的后两行
aaaaa
55555
66666
[root@localhost ~]# cat a|grep -B2 "a"  ==>匹配的前两行
11111
AAAAA
aaaaa
[root@localhost ~]# cat a|grep -C2 "a"  ==>匹配的前后各两行
11111
AAAAA
aaaaa
55555
66666

基本正则表达式的元字符:

字符匹配:

.  :匹配任意单个字符

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

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

[:digit:]:数字

[:lower:]:小写字母

[:upper:]:大写字母

[:alpha:]:所有字母

[:alnum:]:所有数字和字母

[:space:]:空白字符(包含空格和tab)

[:punct:]:标点符号

[root@localhost ~]# cat a|grep 'A'  ==>匹配字符A
AAAAA
[root@localhost ~]# cat a|grep '[^A]' ==>匹配A以外的任意字符
11111
aaaaa
55555
66666
00000
[root@localhost ~]# cat a|grep '[[:digit:]]' ==>匹配数字
11111
55555
66666
00000

次数匹配

*   :匹配前面的字符任意此,包括0次  ==>默认贪婪模式,尽可能长的匹配

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

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

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

\{m\}:匹配前面的字符m次

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

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

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

位置锚定

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

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

^pattern$ :用于模式匹配整行

^$:空行

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

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

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

\<pattern\>:匹配整个单词

小使用案例:

执行了指令:grep "\<[0-9]\{2,3\}\>" /etc/passwd

blob.png

说明:

\< \>:锚定了词首和词尾,说明匹配的是整个单词

[0-9]:数字

\{2,3\}:前面数字出现了2-3次

/etc/passwd  :指定文件

上面表示找出/etc/passwd文件中的两位数或三位数

分组及引用

分组:\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如\(root\)

      分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,

      这些变量的命名方式为:\1,\2,\3,….

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

      实例:\(string1\+\(string2\)*\)

            \1:string\+\(string2\)*

            \2:string2

后向引用:引用前面的分括号中的模式所匹配字符(而非模式本身)

blob.png

blob.png

egrep:扩展正则表达式,和grep  -E效果相似

字符匹配:

.  :任意单个字符

[] :指定范围内的字符

[^]:指定范围外的字符

次数匹配:

*  :匹配前面字符任意次

? :0次或1次

+  :至少一次

{m} :匹配m次

{m,n}:匹配至少m次,至多n次

位置锚定:

^:锚定行首

$:锚定行尾

\<或\b:锚定词首

\>或\b:锚定词尾

上面的小案例,使用扩展正则表达式来解决

blob.png

\< \>:锚定词首词尾,匹配单词

[0-9]:数字

{2,3}:2次或者3次,这里和上面的不同,没有使用转义符"\"

/etc/passwd:文件

找出/etc/passwd文件中的两位数或三位数,和上面结果一样

分组:

()

 后向引用: \1,\2

或者

a|b

C|cat  :C或者cat

(C|c)at: Cat或cat

扩展正则表达式其实和基本正则表达式差不多,差异在于,扩展正则表达式在使用元字符时,

不需要用于转义的"\"

以上都是些概念性的知识,不是很好理解,在博客作业中有实际用法

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