文本处理工具
文本处理工具
目录
9 文本处理工具
5.1 wc
5.2 cut
5.3 sort
5.4 unique
5.5 diff 和 patch
3.1 egrep 简介
3.2 egrep 使用格式
3.3 egrep示例
2.1 grep 简介
2.2 grep 使用格式
2.3 grep 示例
1 文本处理工具
2 grep
3 egrep
4 fgrep
5 文本查看及处理工具:wc,cut,sort,uniq,diff,patch
1 文本处理工具
Linux上文本处理三剑客:
grep,egrep,fgrep :文本过滤工具(以模式:pattern 进行过滤)
grep:支持基本正则表达式,-E 选项可以支持扩展正则表达式,-F 选项支持 fgrep
egrep:扩展正则表达式,-G 选项可以支持基本正则表达式,-F 选项支持 fgrep
fgrep:不支持正则表达式
sed:stream editor,流编辑;文本编辑工具
awk:Linux上的实现为gawk,文本报告生成器(格式化文本)
2 grep
2.1 grep 简介
grep:Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的模式对目标文本逐行进行匹配检查,打印匹配到的行
模式:由正则表达式元字符及文本字符所编写出的过滤条件
正则表达式相关内容可参考博文:https://www.cnblogs.com/ckh2014/p/14100791.html
2.2 grep 使用格式
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用选项:
--color=auto :对匹配到的文本着色后高亮显示
-i :ignorecase,忽略字符大小写
-o :仅显示匹配到的字符串本身
-v,--invert-match :显示不能够被pattern匹配到的行
-E :支持使用扩展的正则表达式元字符
-q,--quiet,--slient :静默模式,即不输出任何信息
-A #:after,后#行
-B #:before,前#行
-C #:context,前后各#行
2.3 grep 示例
1、显示/etc/passwd文件中不以/bin/bash结尾的行
[root@node2 ~]# grep -v /bin/bash$ /etc/passwd
2、找出/etc/passwd文件中两位数或三位数
[root@node2 ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行
[root@node2 ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4、找出"netstat -atn"命令的结果中以"LISTEN"后跟0、1或多个空白字符结尾的行
[root@node2 ~]# netstat -atn | grep "LISTEN[[:space:]]*$"
3 egrep
3.1 egrep 简介
egrep 支持扩展的正则表达式实现类似于grep文本过滤功能;grep -E
3.2 egrep 使用格式
egrep [OPTIONS] PATTERN [FILE...]
egrep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用选项:
--color=auto :对匹配到的文本着色后高亮显示
-i :ignorecase,忽略字符大小写
-o :仅显示匹配到的字符串本身
-v,--invert-match :显示不能够被pattern匹配到的行
-G:支持基本正则表达式
-q,--quiet,--slient :静默模式,即不输出任何信息
-A #:after,后#行
-B #:before,前#行
-C #:context,前后各#行
3.3 egrep示例
练习1:
1、显示/etc/passwd文件中不以/bin/bash结尾的行
[root@node2 ~]# egrep -v "/bin/bash$" /etc/passwd
2、找出/etc/passwd文件中两位数或三位数
[root@node2 ~]# egrep "[0-9]{2,3}" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行
[root@node2 ~]# egrep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
4、找出"netstat -atn"命令的结果中以"LISTEN"后跟0、1或多个空白字符结尾的行
[root@node2 ~]# netstat -atn | egrep "LISTEN[[:space:]]*$"
练习2:
1、找出 /proc/meminfo 文件中,所有以大写或小写S开头的行;至少有三种实现方式;
[root@node2 ~]# grep -i "^[Ss]" /proc/meminfo
[root@node2 ~]# grep -i ^s /procmeminfo
[root@node2 ~]# egrep -i ^S /proc/meminfo
[root@node2 ~]# grep -E "^(s|S)" /proc/meminfo
2、显示当前系统上root、centos或user1用户的相关信息;
[root@node2 ~]# egrep "^(root|centos|user1)\>" /etc/passwd
3、找出 /etc/rc.d/init.d/functions 文件中某单词后面跟一个小括号的行;
[root@node2 ~]# egrep "^[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
4、使用echo命令输出一绝对路径,使用egrep取出基名;
[root@node2 ~]# echo "/proc/sys/net/ipv4/ip_forward" | grep -E -o "[^/]+/?$"
进一步,取出其路径名:
[root@node2 ~]# echo "/proc/sys/net/ipv4/ipforward/" | grep -E -o "^/.*/\b"
5、找出ifconfig 命令结果中的 1-255 之间的数值;
[root@node2 ~]# ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>"
6、找出ifconfig命令结果中的IP地址;
[root@node2 ~]# ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>"172.26.255.255 172.17.255.255 192.168.2.12 192.168.2.255
[root@node2 ~]# ifconfig | grep -E -o "(\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>.){3}(\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>)"
7、添加用户 bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;
[root@node2 ~]# grep -E "^([[:alnum:]_]+\b).*\1$" /etc/passwd
[root@node2 ~]# grep -E "^([^:]+\>).*\1$" /etc/passwd
4 fgrep
fgrep 不支持正则表达式元字符。
当无需用到元字符去编写模式时,使用 fgrep 性能更好。
5 文本查看及处理工具:wc,cut,sort,uniq,diff,patch
5.1 wc
wc - word count,print newline, word, and byte counts for each file
使用格式:wc [OPTION]... [FILE]...
常用选项:
-l :lines,统计行数
-w :words,统计单词数
-c :bytes,统计字节数
5.2 cut
cut - 文本截取工具,remove sections from each line of files
使用格式:cut OPTION... [FILE]...
常用选项:
-d CHAR:以指定的字符为分隔符
-f fields: 挑选出的字段
#:指定的单个字段
#,#[,#]:离散的多个字段
#-# :连续的多个字段
--output-delimiter=STRING :指明输出时的分隔符
5.3 sort
sort - sort lines of text files
使用格式:sort [OPTION]... [FILE]...
常用选项:
-f :忽略字母大小写
-r :逆序显示
-t CHAR :指定字段分隔符
-k # :以指定字段为标准排序
-n :以数值大小进行排序
-u :uniq,重复的行只保留一份
重复的行:连续且相同方为重复
5.4 unique
uniq - report or omit repeated lines,报告或移除重复的行
使用格式:uniq [OPTION]... [INPUT [OUTPUT]]
-c :显示每行重复出现的次数
-d :仅显示重复过的行
-u :仅显示不曾重复的行
练习:以冒号分隔,取出/etc/passwd文件的第6至第10行的各自的第1个字段,并将这些信息按第三个字段的数值大小排序
head -10 /etc/passwd | tail -5 | sort -t: -k3 -n | cut -d:-f1
练习:取出 ifconfig ens33 命令结果中的 ip 地址
[root@node2 ~]# ifconfig ens33 | grep "inet\>" | cut -d" " -f10192.168.2.12
5.5 diff 和 patch
diff - compare files line by line,逐行比较文件中的内容
使用格式:diff [OPTION]... FILES
dff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
-u :使用 unfield 机制,即显示要修改的行的上下文,默认为3行
patch - apply a diff file to an original,向文件打补丁
使用格式:
patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE
patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE
范例:
[root@node2 ~]# cp /etc/fstab ./[root@node2 ~]# cp fstab fstab.new[root@node2 ~]# vim fstab.new[root@node2 ~]# diff fstab fstab.new2c2 < # --- > # comment [root@node2 ~]# diff fstab fstab.new > fstab.patch # 比较原文件和新文件的不同之处,将结果保存在 补丁文件中[root@node2 ~]# patch -i fstab.patch fstab # 对原文件打补丁patching file fstab [root@node2 ~]# patch -R -i fstab.patch fstab # 还原文件,逆向打补丁patching file fstab