Linux中,日志和配置都使用文本來存儲和修改,對文本的查看及處理是最基本也是最常用的操作之一。而文本處理工具中,有被稱為Linux文本處理三劍客的grep、sed和awk,但不要激動,Linux文本三劍客另起文章來講,本文先從一些經常用到的,功能簡潔但非常實用的工具說起。
- wc命令
- cut命令
- sort命令
- uniq命令
- diff命令
- patch命令
- tr命令
- 文本處理相關示例
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
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97637