美文网首页
7、Linux命令之文本处理工具

7、Linux命令之文本处理工具

作者: 靜默 | 来源:发表于2017-11-20 21:07 被阅读46次

    Linux一切皆文件,因此对文本就会频繁操作,增删改查,也就有对文本处理的各种工具,下面介绍常用工具,以及各工具常用用法,常用案例等

    一、文本的查看

    1、cat -n 文件 加行号显示文本
    -E 文件 显示回车符号
    -A 文件 显示文本所有字符 $表示换行, ^I表示tab ,^M表示回车(一般win系统文本才有)
    -s 文件 当遇到有连续两行以上的空白行,就代换为一行的空白行
    -v windos上文本文件 显示非打印”显示控制字符除了LFD和标签使用` ^”具有高位设置的符号和前面字符“m”
    cat file1 file2 >file3 把两个文件合并一个文件

    举例:


    image.png

    -n用法


    image.png
    -E用法
    image.png

    -A用法
    这个类似-E,显示多一些看不到的字符,ceshi.txt是在Windows下建立的文本


    image.png
    -s用法
    image.png
    -v用法
    这个可以和-A结合理解记忆
    image.png
    用cat合并两个文件
    image.png

    2、tac 文件 倒着显示,是以行,颠倒显示


    image.png

    3、echo 字符 | rev 反向显示,是以列 左右倒着


    image.png

    4、less 分行显示
    more 分页显示
    这两个命令常用,一般和其它命令组合使用较多,比如查看很长的命令帮助文档,需要分页显示查看


    image.png
    image.png

    按空格向下翻页查看

    5、head -n 3 文件 显示文件前三行
    -c 20 文件 显示头部20个字符


    image.png

    6、tail -n3 文件 显示文件后三行
    -f 文件 动态观察文件 用于观察日志文件,监控文件
    -F 文件 和f一样,多了文件被删除,会有提示


    image.png
    image.png
    image.png

    tailf类似tail -f
    前者只在修改时监控扫描文件内容,不耗资源;后者频繁扫描监控文件内容,耗资源,因此一般都会用tailf

    7、cut 取出特定列
    cut -d: -f1,3 文件 以冒号为分隔符,取出内容第一和第三列
    -d 指明分隔符 默认以tab为分隔符
    --output-delimiter=" " 取出的列,以什么字符隔开
    -f1 取第一列 混合使用:f1-3,7 第一列到第三列和第七列
    -c 字符切割 一般列比较整齐的使用


    image.png
    image.png

    paste file1 file2 两个文件 file1第几行对应file2第几行 左右对应显示显示
    -s file1 file2 两个文件 file1第几行对应file2第几行 上下对应显示显示


    image.png image.png

    练习------常用案例:
    ss -nt | tr -s " " : | grep ESTAB | cut -d: -f6 取出和我对话的IP


    image.png

    df | grep /dev/sd | tr -s " " % | cut -d% -f5 取出磁盘利用率信息


    image.png

    cat /etc/passwd | head -n5 | cut -d: -f1,3 | tr ":" "-" 取出用户和UID


    image.png

    取当前主机指定网卡的IP:
    ifconfig ens33 | grep netmask |tr -s " "| cut -d" " -f3 centos 7上


    image.png

    ifconfig eth0 | grep Mask |tr -s " " : | cut -d: -f4 centos 6上


    image.png

    生成指定位数的随机口令:
    cat /dev/urandom | tr -dc '[:alnum:]' | head -c30
    openssl rand -base64 30 | head -c30


    image.png

    二、文本的统计-分析

    1、wc 文件 显示文件有几行,几个单词,几个字节
    -l 文件 只统计行
    -w 文件 只统计单词
    -c 文件 只统计字节
    -m 文件 只统计字符 一个汉字是一个字符、三个字节
    -L 文件 只统计最长行的长度

    image.png
    image.png

    2、sort -nr -t: -k3 文件 取出以冒号分隔的第三列按数字反向排序
    -n 按数字排序
    -t 按什么分隔符
    -k 哪一列排序
    -r 反向排序
    -u 删除输出重复行

    image.png
    image.png

    3、uniq 文件 相邻一样的合并输出显示
    -c 文件 显示合并的字符有几个同样的
    -u 文件 只显示不重复的
    -d 文件 只显示重复的


    image.png

    练习------常用案例:
    提取网站访问日志文件访问次数高的前十名
    tr -s " " <access_log | cut -d" " -f1|sort |uniq -c | sort -n|tail

    image.png
    image.png
    image.png
    image.png

    ss -nt 查询并发连接的远程IP最多的前三个IP
    ss -nt | grep ESTAB | tr -s " " :|cut -d: -f6|sort|uniq -c|sort -nr |head -3|tr -s " " | cut -d" " -f3


    image.png
    image.png
    image.png

    比较文件
    4、diff file1 file2 比较文件内容不同
    -u

    image.png

    通过差异存档,可以恢复删掉的文件
    diff f3 f4 -u >f8
    rm f4
    patch -b f3 f8
    注意:系统没有装patch命令的包,需要取手动装一下
    恢复的文件f4,会覆盖了f3,f3内容是原f4内容,原f3会生成一个备份文件

    image.png
    image.png
    image.png
    image.png

    三、文本处理三剑客

    grep sed awk 这里主要讲grep,其它两个后面单独一个命令写一篇

    1、grep 行搜索并筛选
    egrep=grep -E
    fgrep=grep -F

    grep 关键字 文件或目录
    关键字可以是字符,可以是命令(用反向单引号扣起来命令),也可以引用变量(用双引号括起来或者不用)
    -v 反选包含关键字以外的行

    image.png

    -i 忽略关键字大小写


    image.png

    -n 显示包括关键字的行以及行号
    -c 匹配到关键字的行,有几行


    image.png

    -q 匹配到关键字的行,只是不显示(这种用法,后面用到,用处:只想知道匹配到还是没匹配到,匹配结果不关心)


    image.png

    -o 仅显示匹配到的关键字


    image.png

    -A n 包含关键字行的后n行也显示
    -B n 包含关键字行的前n行也显示
    -C n 包含关键字行的前后各n行也显示


    image.png

    -e 或关系,多个关键字筛选


    image.png

    -w 匹配关键字是一个词,不是一部分,除了数字、字母、下划线不可以作为单词的分隔符,其它键盘字符都可以


    image.png

    四、正则表达式

    基本正则表达式:BRE
    扩展正则表达式:ERE
    正则表达式匹配的是内容里字符串

    元字符分类:

    1、字符匹配
    . 一个任意字符串
    [] 任意单一的字符
    [^] 排除
    [:alnum:] 数字和字母
    [:alpha:] 字母
    [:space:] 空格
    [:digit:] 数字
    [:loewr:] 小写字母
    [:upper:] 大写字母
    [:blank:] 空白字符

    2、匹配次数
    * 星号前面字符重复任意次,包括零次
    .* 任意字符
    \? 匹配前面字符重复0次或1次
    \+ 匹配前面字符至少一次以上
    \{n\} 匹配前面字符n次
    \{m,n\} 匹配前面字符至少m次,至多n次
    \{,n\} 匹配前面字符至多n次
    \{n,\} 匹配前面字符至少n次

    正则表达式涉及符号最好用引号引起来,不然有时会当作通配符用了

    image.png
    这个当成通配符a* 搜索针对的是ls传递过来包含a的文件名
    这个是正则表达式"a*" 搜索针对的是ls传递过来的内容

    3、位子锚定
    ^ 以什么开头的行 ^root
    $ 以什么结尾的行 bash$
    ^$ 取空行
    \< 词首以什么字符的行 \ <r
    \> 词尾以什么字符的行 r\>
    \<\> 匹配单词 \<root\>
    \ 转义符

    4、分组

    \(\) 将一个或多个字符当作一个整体取处理,这就需要用到分组 (root)
    \| 或者 a\|b a或者b \(A\|a\)b Ab或ab
    echo axx bxx cxx | grep “\(a\|b\|c\)xx”
    \n 后项引用,调用前面第n个括号里的正则表达式
    例如:\(a..b\).*\(x..y\).*\1.*\2* 所以:\1=\(a..b\) \2=\(x..y\)

    练习-----常用案例
    扫描网段在用的IP,使用-B的的场景用法
    -sP:ping扫描,仅发现目标主机是否存活
    nmap -v -sP 172.18..2.0/24 | grep -B1 up | grep report | cut -d" " -f5


    image.png
    image.png
    image.png
    image.png

    搜索筛选两个关键字包含的行 是或的关系
    grep -e root -e wang /etc/passwd


    image.png

    判断主版本号
    grep -o "[[:digit:]]+" /etc/centos-release |head -n1


    image.png

    取函数名
    grep -o "^[[:alnum:]_]+[[:space:]]*()" /etc/init.d/functions


    image.png
    image.png
    image.png

    函数都是在开头,需要牟定行首


    image.png

    练习:
    1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
    grep "^[Ss]" /proc/meminfo
    grep -i "^s" /proc/meminfo


    image.png

    2、显示/etc/passwd文件中不以/bin/bash结尾的行
    grep -v "/bin/bash$" /etc/passwd


    image.png

    3、显示用户rpc默认的shell程序
    grep "^rpc\>" /etc/passwd |cut -d: -f7


    image.png

    4、找出/etc/passwd中的两位或三位数
    grep -o "\b[0-9]{2,3\}\b" /etc/passwd


    image.png
    image.png

    需要牟定词首词尾,否者这个也被匹配


    image.png
    image.png

    5、显示CentOS7的/etc/grub.conf文件中,至少以一个空白字符开头的且后面存非空白字符的行
    grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf


    image.png

    6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
    netstat -tna |grep "LISTEN[[:space:]]*$"


    image.png

    7、显示CentOS7上所有系统用户的用户名和UID
    cut -d: -f1,3 /etc/passwd |grep "\b[0-9]\{1,3\}$"


    image.png
    image.png
    image.png
    image.png

    8、找出/etc/passwd用户名同shell名的行
    grep "^\(.*\):.*\<\1$" /etc/passwd
    grep "^\(.*\)\>.*\b\1$" /etc/passwd


    image.png

    9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
    df |grep "/dev/sd" |grep -o "\<[[:digit:]]\{1,3\}%" |grep -o "[[:digit:]]\{1,3\}" |sort -nr


    image.png

    10、显示三个用户root、mage、wang的UID和默认shell
    grep -o "^\(root\|mage\|wang\)\>" /etc/passwd|cut -d: -f3,7


    image.png

    11、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
    grep -o "^[[:alpha:]_]*()" /etc/rc.d/init.d/functions


    image.png

    12、使用egrep取出/etc/rc.d/init.d/functions中其基名
    echo "/etc/rc.d/init.d/functions" |egrep -o "[^/]+/?$" |egrep -o ".*[^/]"


    image.png

    13、使用egrep取出上面路径的目录名
    echo "/etc/rc.d/init.d/functions/" |egrep -o "^/./" |egrep -o ".[^/]"

    image.png

    14、统计last命令中以root登录的每个主机IP地址登录次数
    last | grep "^root" |tr -s " " -|cut -d- -f3 |sort| uniq -c


    image.png

    15、显示ifconfig命令结果中所有IPv4地址
    ifconfig ens33 |grep -o "([0-9]{1,3}.){3}[0-9]{1,3}" 点需要去转义


    image.png

    精确匹配
    ifconfig ens33 |egrep -o "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"


    image.png

    16、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
    echo "welcome to magedu linux" | grep -o "[[:alpha:]]" |sort |uniq -c|sort -nr


    image.png

    17、用正则表达式表示出QQ号
    [1-2][0-9]\{10\}
    18、用正则表达式表示手机号
    ^1[3-9][0-9]\{9\}$

    相关文章

      网友评论

          本文标题:7、Linux命令之文本处理工具

          本文链接:https://www.haomeiwen.com/subject/mammvxtx.html