阅读 168

文本处理工具

文本处理工具

目录

  • 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


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐