Linux文本查看及处理工具

Linux中,日志和配置都使用文本来存储和修改,对文本的查看及处理是最基本也是最常用的操作之一。而文本处理工具中,有被称为Linux文本处理三剑客的grep、sed和awk,但不要激动,Linux文本三剑客另起文章来讲,本文先从一些经常用到的,功能简洁但非常实用的工具说起。

  1. wc命令
  2. cut命令
  3. sort命令
  4. uniq命令
  5. diff命令
  6. patch命令
  7. tr命令
  8. 文本处理相关示例

1、wc命令

wc,word count,从字面意思可以看出,这是一个统计工具,它可以实现行、字节、单词的个数统计,就个人工作而言,经常用于统计端口连接数、程序打开文件数等等。

  • wc [OPTION]... [FILE]...
    • -l:lines,统计行数
    • -w:words,统计单词数
    • -b:bytes,统计字节数

man手册是这样定义的:print newline, word, and byte counts for each file,它可以一次统计多个文件,单独打印,并在最后统计总数。

  • 例如:分别统计/etc/passwd和/etc/group文件中的行数,并统计总行数:
    [root@localhost ~]# wc -l /etc/passwd /etc/group
    42 /etc/passwd
    70 /etc/group
    112 total
  • 其余两种统计方式和行数统计相同。

2、cut命令

将标准输出裁剪后打印。

  • cut OPTION... [FILE]...
    常用的有以下两个选项:

    • -d:delimiter,指明定界符,默认定界符为tab
    • -f:fields,指明要打印的字段,以定界符分割,从左向右数
      可以打印单个字段、连续的多个字段、分散的多个字段
  • 例如,只打印出/etc/passwd中的用户名:
    [root@localhost ~]# cut -d":" -f1 /etc/passwd
    root
    bin
    daemon
    ...

  • 打印出用户名及使用的shell:
    [root@localhost ~]# cut -d":" -f1,7 /etc/passwd
    root:/bin/bash
    bin:/sbin/nologin
    daemon:/sbin/nologin
    ...

3、sort命令

基于行的工具,用于实现行的排序,默认按行首的字符排序。
可以通过指定相关参数,实现灵活排序。

  • sort [OPTION]... [FILE]...

    • -t CHAR:指定分隔符
    • -k #:指定用于排序的字段
    • -n:基于数值大小排序,而非字符
    • -r:逆序
    • -f:忽略字符大小写
    • -u:unique,重复的行只保留一份
  • 例如,使用UID的数值大小,对/etc/passwd的内容进行排序:
    [root@localhost ~]# sort -t":" -k3 -n /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    ...

4、uniq命令

uniq也是基于行的工具,report or omit repeated lines,它可以对重复的行内容进行处理,显示或忽略重复的行。

  • uniq [OPTION]... [INPUT [OUTPUT]]
    • -c:显示每行的重复次数
    • -u:只显示未重复过的行
    • -d:只显示重复过的行
      uniq命令一般和sort命令结合使用,先用sort将行排序(因为uniq命令是比较相邻的行),这样可以将重复的行排在一起。
  • 先制作一个有重复行的文件:
    [root@localhost ~]# touch /tmp/uniq.test
    [root@localhost ~]# vim /tmp/uniq.test
    aaaaa
    aaaaa
    bbbbb
    ccccc
    ddddd
    aaaaa
    bbbbb
  • 显示每行的重复次数:
    [root@localhost ~]# sort /tmp/uniq.test | uniq -c
    3 aaaaa
    2 bbbbb
    1 ccccc
    1 ddddd
  • 只显示未重复过的行:
    [root@localhost ~]# sort /tmp/uniq.test | uniq -u
    ccccc
    ddddd
  • 只显示重复过的行,并显示其重复次数:
    [root@localhost ~]# sort /tmp/uniq.test | uniq -dc
    3 aaaaa
    2 bbbbb

5、diff命令

逐行比对两个文件的内容,将不一致的地方显示出来。

  • diff [OPTION]...FILES

    • -u:使用unified机制,即显示要修改的行的上下文,默认为3行。
  • 制作两个有区别的文件,复制/etc/passwd到/tmp/passwd1和/tmp/passwd2,更改passwd1中root的UID为1500。

  • 比较/tmp/passwd1和/tmp/passwd2,显示两个文件中不同的行:
    [root@localhost ~]# diff /tmp/passwd1 /tmp/passwd2
    1c1 \\显示第几行
    < root:x:1500:0:root:/root:/bin/bash \\第一个文件中的内容
    ---
    > root:x:0:0:root:/root:/bin/bash \\第二个文件中的内容

  • 可以使用-u指定显示的上下文行数,便于查看上下文关系,这里指定2行:
    [root@localhost ~]# diff -u2 /tmp/passwd1 /tmp/passwd2
    --- /tmp/passwd1 2018-05-06 17:58:52.831498629 +0800
    +++ /tmp/passwd2 2018-05-06 17:58:32.489500311 +0800
    @@ -1,3 +1,3 @@
    -root:x:1500:0:root:/root:/bin/bash
    +root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin

  • diff命令还可用于生成补丁文件,用于将两个文件的不同之处保存为补丁,便于之后用patch命令打补丁。其实就是将diff命令的标准输出重定向到一个补丁文件中。比如,将/tmp/passwd1和/tmp/passwd2的不同之处保存到/tmp/passwd.patch补丁文件中:
    [root@localhost ~]# diff /tmp/passwd1 /tmp/passwd2 ``> /tmp/passwd.patch
    [root@localhost ~]# cat /tmp/passwd.patch
    1c1
    < root:x:1500:0:root:/root:/bin/bash
    ---
    > root:x:0:0:root:/root:/bin/bash
    这样,就可以用patch命令向/tmp/passwd1打补丁,将其内容更改为和/tmp/passwd2相同。

6、patch命令

apply a diff file to an original,将一个diff文件(补丁文件)应用于源文件。

  • patch [options] [originalfile [patchfile]]

    • -i:指明补丁文件patchfile,从patchfile中读取补丁内容
  • 例如,将上述例子中的passwd.patch打补丁到/tmp/passwd1中,再比较passwd1和passwd2,已经没有任何不同:
    [root@localhost ~]# patch -i /tmp/passwd.patch /tmp/passwd1
    patching file /tmp/passwd1
    [root@localhost ~]# diff /tmp/passwd1 /tmp/passwd2
    [root@localhost ~]#

  • 还有另一种方式,即利用输入重定向,用/tmp/passwd.patch的内容替代标准输入:
    [root@localhost ~]# patch /tmp/passwd1 < /tmp/passwd.patch

7、tr命令

translate or delete characters,转换或删除字符。

  • tr [OPTION]... SET1 [SET2]
    把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符。
    tr命令不接受文件作为输入, 所以tr命令要配合输入重定向<来使用,而且tr命令只是更改显示方式,对文件内容不做更改。
    • -d:delete,删除字符
  • 例如,将/etc/passwd中的root转换为ROOT后输出:
    [root@localhost ~]# tr [root] [ROOT] < /etc/passwd
    ROOT:x:0:0:ROOT:/ROOT:/bin/bash
  • 将/etc/passwd中的:冒号删除后输出:
    [root@localhost ~]# tr -d [:] < /etc/passwd
    rootx00root/root/bin/bash
    binx11bin/bin/sbin/nologin
    daemonx22daemon/sbin/sbin/nologin
    ...

8、文本处理相关示例

  • 列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。
    [root@localhost ~]# who | cut -d" " -f1 | uniq
    mageia
    root
  • 取出最后登录到当前系统的用户的相关信息
    [root@localhost etc]# id $(last | head -1 | cut -d' ' -f1)
    uid=1100(mageia) gid=1100(mageia) groups=1100(mageia)
  • 取出当前系统上被用户当作其默认shell的最多的那个shell。
    [root@localhost ~]# cut -d":" -f7 /etc/passwd | sort | uniq -c | sort -n | tail -1
    30 /sbin/nologin
  • 将/etc/passwd中的第三个字段数值最大的10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。
    [root@localhost ~]# sort -n -t":" -k3 /etc/passwd | tail -10 | tr [a-z] [A-Z] > /tmp/maxusers.txt
    [root@localhost ~]# cat /tmp/maxusers.txt
    POLKITD:X:997:995:USER FOR POLKITD:/:/SBIN/NOLOGIN
    SYSTEMD-NETWORK:X:998:996:SYSTEMD NETWORK MANAGEMENT:/:/SBIN/NOLOGIN
    SYSTEMD-BUS-PROXY:X:999:997:SYSTEMD BUS PROXY:/:/SBIN/NOLOGIN
    USER2:X:1000:1001::/HOME/USER2:/BIN/BASH
    USER3:X:1001:2223::/HOME/USER3:/BIN/BASH
    MAGEIA:X:1100:1100::/HOME/LINUX:/BIN/BASH
    SUSE2:X:1101:1101::/HOME/SUSE2HOME:/BIN/BASH
    USER:X:1102:1102::/HOME/USER:/BIN/BASH
    SLACWARE:X:2002:2016::/HOME/SLACWARE:/BIN/TCSH
    NFSNOBODY:X:65534:65534:ANONYMOUS NFS USER:/VAR/LIB/NFS:/SBIN/NOLOGIN
  • 取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
    [root@localhost ~]# ifconfig | grep inet[[:space:]] | cut -d" " -f10 | head -1
    192.168.1.150
  • 列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中。
    [root@localhost etc]# ls *.conf | tr [a-z] [A-Z] > /tmp/etc.conf
    [root@localhost etc]# cat /tmp/etc.conf
    ASOUND.CONF
    AUTOFS.CONF
    AUTOFS_LDAP_AUTH.CONF
    ...
  • 显示/var目录下一级子目录或文件的总个数。
    [root@localhost ~]# ll /var | wc -l
    24
  • 取出/etc/group文件中第三个字段数值最小的10个组的名字。
    [root@localhost ~]# sort -n -t":" -k3 /etc/group | head -10 | cut -d":" -f1
    root
    bin
    daemon
    sys
    adm
    tty
    disk
    lp
    mem
    kmem
  • 将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。
    [root@localhost ~]# cat /etc/fstab /etc/issue > /tmp/etc.test
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270