Linux中的文本处理工具

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/gongxifacai_believe/article/details/83550199

1、Linux上的文本处理三剑客

(1)grep, egrep, fgrep:文本过滤(通过模式pattern过滤)工具;
1)grep:默认用基本正则表达式过滤,但有选项-E,-F,-E用于扩展正则表达式;-F表示不支持正则表达式。
2)egrep:默认用扩展正则表达式过滤, 但有选项-G,-F,-G用于基本正则表达式,-F表示不支持正则表达式。
3)fgrep:默认不支持正则表达式,但有选项-E, -G,-E用于扩展正则表达式,-G用于基本正则表达式。
(2)sed:stream editor,流编辑器,是一种文本编辑工具;
(3)awk:Linux上的实现为gawk,文本报告生成器(格式化文本报告);

2、正则表达式

正则表达式(Regual Expression, REGEXP)由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能。正则表达式分为两类:基本正则表达式(BRE)和扩展正则表达式(ERE)。

3、grep

grep:Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,并打印匹配到的行。
模式:由正则表达式的元字符及文本字符所编写出的过滤条件。

grep  [OPTIONS]  PATTERN  [FILE...]
grep  [OPTIONS]  [-e PATTERN | -f FILE]  [FILE...]

-e        可以指定多个PATTERN
-f FILE   将多个PATTERN放在FILE中,从FILE中读取PATTERN

OPTIONS:
--color=auto:对匹配到的文本着色后高亮显示;
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-v, --invert-match:显示不能被模式匹配到的行;
-E:支持使用扩展的正则表达式元字符;
-q, --quiet, --silent:静默模式,即不输出任何信息;
-A #:after, 后#行
-B #:before,前#行
-C #:context,前后各#行

(1)基本正则表达式
1)字符匹配:
. :匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
                                                   字母     字母+数字 标点符号

[root@localhost ~]# grep "r[[:alpha:]][[:alpha:]]t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

2)匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,默认工作于贪婪模式。
** : 匹配其前面的字符任意次;0,1,多次。
. * :匹配任意长度的任意字符。
?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的。
+:匹配其前面的字符1次或多次;即其前面的字符要出现至少1次。
{m}:匹配其前面的字符m次;
{m,n}:匹配其前面的字符至少m次,至多n次;
{0,n}:至多n次
{m,}:至少m次
3)位置锚定:
^:行首锚定;用于模式的最左侧;
$ :行尾锚定;用于模式的最右侧;
^PATTERN$ :用于PATTERN来匹配整行;
^$ :空白行;
^ [[:space:]]*$:空行或包含空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
< 或 \b:词首锚定,用于单词模式的左侧;
> 或 \b:词尾锚定,用于单词模式的右侧;
<PATTERN>:匹配完整单词,精确锚定单词;

例:
1、显示/etc/passwd文件中不以/bin/bash结尾的行;
~]# grep -v "/bin/bash$" /etc/passwd						
2、找出/etc/passwd文件中的两位数或三位数;
~]# grep  "\<[0-9]\{2,3\}\>"  /etc/passwd    基本正则表达式
~]# grep -E "\<[0-9]{2,3}\>" /etc/passwd     扩展正则表达式  						
3、找出/etc/rc.d/rc.sysinit(CentOS6上)或/etc/grub2.cfg(CentOS7上)文件中,以至少一个空白字符开头,且后面非空白字符的行;
~]# grep  "^[[:space:]]\+[^[:space:]]"  /etc/grub2.cfg     基本正则表达式
~]# grep  "^[[:space:]]+[^[:space:]]"  /etc/grub2.cfg      扩展正则表达式						
4、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;
~]# netstat -tan | grep  "LISTEN[[:space:]]*$"

空白字符包含空格也包含tab,即[[:space:]]包含空格也包含tab;
4)分组及引用
():将一个或多个字符捆绑在一起,当作一个整体进行处理;
(xy)*ab

分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3

He loves his lover.
He likes his lover.
She likes her liker.
She loves her liker.
~]# grep "\(l..e\).*\1" lovers.txt
后向引用:引用前面的分组括号中的模式所匹配到的字符。

4、egrep

支持扩展的正则表达式实现类似于grep文本过滤功能,相当于grep -E。

egrep [OPTIONS] PATTERN [FILE...]
选项:
-i, -o, -v, -q, -A, -B, -C
-G:支持基本正则表达式

(1)扩展正则表达式
1)字符匹配:
.:任意单个字符;
[]:指定范围内的任意单个字符;
[^]:指定范围外的任意单个字符;
2)次数匹配:
*:任意次,0,1或多次;
?:0次或1次,其前的字符是可有可无的;
+:其前字符至少1次;
{m}:其前的字符m次;
{m,n}:至少m次,至多n次;
{0,n}
{m,}
3)位置锚定
^:行首锚定;
$:行尾锚定;
<, \b:词首锚定;
>, \b:词尾锚定;
4)分组及引用:
():分组,括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;
后向引用:\1, \2, …
或:
a|b:a或者b;
C|cat:C或cat
(c|C)at:cat或Cat;

例:
1、找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式;
~]# grep -i "^s" /proc/meminfo
~]# grep "^[sS]" /proc/meminfo
~]# grep -E "^(s|S)" /proc/meminfo
2、显示当前系统上root、centos或user1用户的相关信息;
~]# grep -E "^(root|centos|user1)\>" /etc/passwd      行首,词尾锚定
3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
~]# grep  -E  -o  "[_[:alnum:]]+\(\)"  /etc/rc.d/init.d/functions    
如果需要匹配alnum不能匹配到的字符(如_),需要把其加在外部括号中;					
4、使用echo命令输出一绝对路径,使用egrep取出基名;
~]# echo /etc/sysconfig/ | grep  -E  -o  "[^/]+/?$"				
5、找出ifconfig命令结果中的1-255之间的数值;
~]# ifconfig | grep  -E  -o  "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
6、添加用户bash, testbash, basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;
~]# grep  -E  "^([^:]+\>).*\1$"  /etc/passwd

5、fgrep

fgrep不支持正则表达式元字符,给出的字符当作字符本身搜索,当无需用到元字符去编写模式时,使用fgrep必能更好。

6、wc

wc代表word count,是一种字数统计工具。

wc  [OPTION]...  [FILE]...
-l: lines
-w:words
-c: bytes
[root@localhost ~]# wc /etc/fstab
[root@localhost ~]# wc -l /etc/fstab
[root@localhost ~]# wc -w /etc/fstab
[root@localhost ~]# wc -c /etc/fstab

7、cut

cut是一种文本截取工具。

cut OPTION... [FILE]...
OPTION:
-d CHAR:以指定的字符为分隔符;
-f FIELDS:挑选出的字段;仅保留哪些字段;
#:指定的单个字段;
#-#:连续的多个字段;
#,#:离散的多个字段;
[root@localhost ~]# cut -d: -f1,3-5,7 /etc/passwd
[root@localhost ~]# wc -l /etc/rc.d/init.d/functions | cut -f1
605
[root@localhost ~]# wc -l /etc/rc.d/init.d/functions | cut -d' ' -f1
605

8、sort

sort  [OPTION]...  [FILE]...
-n:基于数值大小而非字符进行排序;
-t CHAR:指定分隔符;
-k #:用于排序比较的字段;
-r:逆序排序;
-f:忽略字符大小写
-u:重复的行只保留一份;
重复行:连续且相同;
[root@localhost ~]# cut -d: -f3 /etc/passwd | sort        按字符排序
[root@localhost ~]# cut -d: -f3 /etc/passwd | sort -n     按数值排序
[root@localhost ~]# sort -t: -k3 -n /etc/passwd           以:为分隔,第3字段,按数值排序
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort -u
/bin/bash
/bin/sync
/sbin/halt
/sbin/nologin
/sbin/shutdown
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort -u | wc -l
5
[root@localhost ~]# grep "bash$" /etc/passwd | wc -l
2

9、uniq

uniq用于报告或移除重复的行,连续且重复的行仅保留一份。

uniq [OPTION]... [INPUT [OUTPUT]]
-c:显示每行的重复次数;
-u:仅显示未曾重复过的行;
-d:仅显示重复过的的行;
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort | uniq -c
2 /bin/bash
1 /bin/sync
1 /sbin/halt
39 /sbin/nologin
1 /sbin/shutdown
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort | uniq -u
/bin/sync
/sbin/halt
/sbin/shutdown
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort | uniq -d
/bin/bash
/sbin/nologin

10、diff

diff用于逐行比较文件。

diff [OPTION]... FILES
diff  /PATH/TO/OLDFILE  /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
-u:使用unfied机制,即显示要修改的行的上下文,默认为3行;

diff可以比较两个目录下的每一个文件,并对每一个文件生成一个单独的补丁,打补丁时,可以分别将补丁补到老目录下的每一个老文件中,使得老目录文件与新目录文件一模一样。

[root@localhost exercise]# diff -u fstab fstab.new
--- fstab	2016-11-28 09:57:45.874174879 +0800
+++ fstab.new	2016-11-28 09:50:57.180168482 +0800
@@ -2,7 +2,7 @@
#
# /etc/fstab
# Created by anaconda on Fri Nov 11 09:39:19 2016
-#
+# comment
 # Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#

11、patch

patch用于向文件打补丁。

patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE    给老文件打补丁	
patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE		
patch -R -i  /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE          给老文件去掉补丁
[root@localhost exercise]# cp /etc/fstab .
[root@localhost exercise]# ls
fstab
[root@localhost exercise]# cp fstab fstab.new
[root@localhost exercise]# nano fstab.new
[root@localhost exercise]# diff fstab fstab.new
5c5
< #
---
> # comment
[root@localhost exercise]# nano fstab.new
[root@localhost exercise]# diff fstab fstab.new > fstab.patch
[root@localhost exercise]# patch -i fstab.patch fstab
bash: patch: command not found...
[root@localhost exercise]# yum install patch
[root@localhost exercise]# patch -i fstab.patch fstab
patching file fstab
[root@localhost exercise]# cat fstab
[root@localhost exercise]# diff fstab fstab.new
[root@localhost exercise]# patch -R -i fstab.patch fstab
patching file fstab
[root@localhost exercise]# cat fstab

猜你喜欢

转载自blog.csdn.net/gongxifacai_believe/article/details/83550199