在Linux系統(tǒng)中,我們經(jīng)常需要使用各種文本處理工具來(lái)處理各種文本信息混埠,熟悉掌握這些使用的小工具誓酒,能極大的提高工作效率。
常用的文本處理工具有以下這些:
cat命令
cat命令的主要功能是將一個(gè)或多個(gè)文件或者標(biāo)準(zhǔn)輸入連接貌亭,并輸出至標(biāo)準(zhǔn)輸出柬唯。通常用來(lái)查看文本文件內(nèi)容。
選項(xiàng) | 說(shuō)明 |
---|---|
-A, --show-all | 等價(jià)于 -vET |
-b, --number-nonblank | 對(duì)非空輸出行編號(hào) |
-e | 等價(jià)于 -vE |
-E, --show-ends | 在每行結(jié)束處顯示 $ |
-n, --number | 對(duì)輸出的所有行編號(hào) |
-s, --squeeze-blank | 不輸出多行空行 |
-t | 與 -vT 等價(jià) |
-T, --show-tabs | 將跳格字符顯示為 ^I |
-u | (被忽略) |
-v, --show-nonprinting | 使用 ^ 和 M- 引用圃庭,除了 LFD 和 TAB 之外 |
--help | 顯示此幫助信息并退出 |
--version | 輸出版本信息并退出 |
要注意的是:如果[文件]缺省锄奢,或者[文件]為 - ,則讀取標(biāo)準(zhǔn)輸入剧腻。
[root@localhost data]# cat <<EOF >test.txt
> 123
> 456
> EOF
[root@localhost data]# cat test.txt
123
456
[root@localhost data]# cat -n test.txt #顯示行號(hào)
1 123
2 456
[root@localhost data]# cat - #缺省時(shí)拘央,讀取標(biāo)準(zhǔn)輸入
sss #標(biāo)準(zhǔn)輸入
sss #讀取內(nèi)容
[root@localhost data]# cat /dev/null >test.txt #/dev/null 是一個(gè)空文件,利用它可以實(shí)現(xiàn)清空效果
tac命令
tac命令书在,即cat命令反過(guò)來(lái)寫的灰伟,功能也類似,是按照行的倒序輸出文本信息儒旬。
rev命令
rev命令栏账,將每一行的前后內(nèi)容倒序輸出帖族。
[root@localhost data]# cat test.txt
123
456
[root@localhost data]# tac test.txt
456
123
[root@localhost data]# rev test.txt
321
654
more和less命令
more命令可以分頁(yè)查看文件文件,左下角會(huì)顯示當(dāng)前顯示距離文末的百分比挡爵,通過(guò)空格鍵可以每次向下翻一頁(yè)竖般,b鍵向上翻一頁(yè),回車鍵每次向下翻一行了讨。按q鍵可以退出捻激。翻到最后一行時(shí),會(huì)自動(dòng)退出more命令前计。
相比于more命令胞谭,less命令執(zhí)行后,默認(rèn)不會(huì)退出男杈,直到用戶執(zhí)行退出命令丈屹。less命令的基本功能與more類似,空格鍵向下翻頁(yè)伶棒,b鍵向上翻頁(yè)旺垒,上下箭頭上移或下移一行,使用g/G可將光標(biāo)切換到文件首頁(yè)/尾頁(yè)肤无,輸入/string回車后先蒋,可以向下進(jìn)行搜索string對(duì)應(yīng)的字符串,?string可以實(shí)現(xiàn)向上查找功能宛渐,配合n和N可以跳到下一個(gè) 或 上一個(gè)匹配竞漾。less 命令是man命令使用的分頁(yè)器。
[root@localhost data]# ls /etc/ | less #more和less經(jīng)常配合管道符一起使用
head和tail命令
head命令常用選項(xiàng)說(shuō)明:
選項(xiàng) | 說(shuō)明 |
---|---|
-c, --bytes=[-]K | 顯示每個(gè)文件的前K 字節(jié)內(nèi)容 ;如果附加"-"參數(shù)窥翩,則除了每個(gè)文件的最后K字節(jié)數(shù)據(jù)外顯示剩余全部?jī)?nèi)容 |
-n, --lines=[-]K | 顯示每個(gè)文件的前K 行內(nèi)容;如果附加"-"參數(shù)业岁,則除了每個(gè)文件的最后K 行外顯示剩余全部?jī)?nèi)容 |
-q, --quiet, --silent | 不顯示包含給定文件名的文件頭 |
-v, --verbose | 總是顯示包含給定文件名的文件頭 |
--help | 顯示此幫助信息并退出 |
--version | 顯示版本信息并退出 |
[root@localhost data]# head /etc/passwd #不帶任何選項(xiàng),默認(rèn)輸出前10行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
....省略以下內(nèi)容
[root@localhost data]# head -c 6 /etc/passwd #顯示前6個(gè)字節(jié)的內(nèi)容
root:x
[root@localhost data]# head -c -6 /etc/passwd #加-表示寇蚊,顯示除了最后6個(gè)字節(jié)的所有內(nèi)容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
....省略以下內(nèi)容
[root@localhost data]# head -n 6 /etc/passwd #顯示前6行內(nèi)容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
....省略一下內(nèi)容
[root@localhost data]# head -n -6 /etc/passwd #顯示除了最后6行之外的全部?jī)?nèi)容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
....省略一下內(nèi)容
tail命令常用選項(xiàng)說(shuō)明:
選項(xiàng) | 說(shuō)明 |
---|---|
--retry | 即使tail開(kāi)始時(shí)就不能訪問(wèn) 或者在tail運(yùn)行后不能訪問(wèn),也仍然不停地嘗試打開(kāi)文件. -- 只與-f合用時(shí)有用. |
-c, --bytes=N | 輸出最后N個(gè)字節(jié) |
-f | 當(dāng)文件增長(zhǎng)時(shí),輸出后續(xù)添加的數(shù)據(jù); -f, --follow以及 --follow=descriptor 都是相同的意思,常用于日志監(jiān)控 |
-n, --lines=N | 輸出最后N行,而非默認(rèn)的最后10行 |
--max-unchanged-stats=N | 參看texinfo文檔(默認(rèn)為5) |
--max-consecutive-size-changes=N | 參看texinfo文檔(默認(rèn)為200) |
--pid=PID | 與-f合用,表示在進(jìn)程ID,PID死掉之后結(jié)束. |
-q, --quiet, --silent | 從不輸出給出文件名的首部 |
-s, --sleep-interval=S | 與-f合用,表示在每次反復(fù)的間隔休眠S秒 |
-v, --verbose | 總是輸出給出文件名的首部 |
--help | 顯示幫助信息后退出 |
--version | 輸出版本信息后退出 |
[root@localhost data]# tail -n 7 /etc/passwd #顯示最后7行內(nèi)容
wufujie:x:1000:1000:myself,home,2013007,3454324:/home/wufujie:/bin/bash
test1:x:1001:1001::/home/test1:/bin/bash
[root@localhost data]# tail -n +7 /etc/passwd #有+時(shí)笔时,表示顯示除了前7行之外的所有內(nèi)容,與head命令的 - 類似
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost data]# ping www.baidu.com >ping.log #ping百度的網(wǎng)址
[root@localhost ~]# tail -f /data/ping.log #再打開(kāi)新的終端查看文件內(nèi)容仗岸,一直在更新 tail命令不會(huì)自動(dòng)退出
PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data.
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=1 ttl=128 time=11.2 ms
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=2 ttl=128 time=11.5 ms
....省略一下內(nèi)容
[root@localhost ~]# tailf /data/ping.log #tailf命令與tail -f類似允耿,不過(guò)可以退出
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=45 ttl=128 time=9.33 ms
tailf: cannot open /data/ping.log: No such file or directory #在另一個(gè)終端窗口刪除ping.log文件后,會(huì)直接退出
wc命令
wc命令可以統(tǒng)計(jì)文件和標(biāo)準(zhǔn)輸入的文本的行數(shù)扒怖,單詞數(shù)右犹,字節(jié)數(shù)和字符數(shù)。
wc命令常用選項(xiàng)說(shuō)明:
選項(xiàng) | 說(shuō)明 |
---|---|
-c, --bytes | 打印字節(jié)數(shù) |
-m, --chars | 打印字符數(shù) |
-l, --lines | 打印行數(shù) |
-L, --max-line-length | 打印最長(zhǎng)行的長(zhǎng)度 |
-w, --words | 打印單詞數(shù) |
[root@localhost data]# wc /etc/passwd #統(tǒng)計(jì)行數(shù)姚垃,單詞數(shù)念链,字節(jié)總數(shù)
50 96 2582 /etc/passwd
[root@localhost data]# wc -l /etc/passwd
50 /etc/passwd
[root@localhost data]# wc -w /etc/passwd
96 /etc/passwd
[root@localhost data]# wc -m /etc/passwd
2582 /etc/passwd
[root@localhost data]# wc -c /etc/passwd
2582 /etc/passwd
[root@localhost data]# wc -L /etc/passwd
99 /etc/passwd
[root@localhost data]# who | wc -l #與管道符連接使用
2
cut和paste命令
cut命令的作用是以指定的分隔符對(duì)文件或標(biāo)準(zhǔn)輸入的每行的內(nèi)容進(jìn)行切割,然后將切割的內(nèi)容按順序編號(hào),最后將指定標(biāo)號(hào)的所有內(nèi)容逐行輸出到標(biāo)準(zhǔn)輸出,默認(rèn)的分隔符為TAB掂墓。
cut命令常用選項(xiàng)說(shuō)明:
選項(xiàng) | 說(shuō)明 |
---|---|
-b, --bytes=LIST | 輸出這些字節(jié) 谦纱,僅顯示行中指定以字節(jié)為單位的范圍的內(nèi)容 |
-c, --characters=LIST | 輸出這些字符 ,僅顯示行中指定以字符為單位的范圍的內(nèi)容 |
-d, --delimiter=DELIM | 使用DELIM取代TAB做字段(field) 分隔符 君编,默認(rèn)的分隔符為TAB |
-f, --fields=LIST | 顯示指定字段的內(nèi)容 |
-n | (忽略) 與-b選項(xiàng)連用跨嘉,不分割多字節(jié)字符,如漢字 |
-s, --only-delimited | 不顯示沒(méi)有分隔符的行 |
--output-delimiter=<字段分割符> | 指定輸出內(nèi)容的是字段分隔符 |
--help | 顯示幫助信息,然后結(jié)束 |
--version | 顯示版本信息,然后結(jié)束 |
使用且只使用-b,-c或-f中的一個(gè)選項(xiàng). LIST由一個(gè)范圍(range)或逗號(hào)隔開(kāi)的多個(gè)范圍組成.范圍是下列形式之一:
N: 第N個(gè)字節(jié), 字符或字段, 從1計(jì)數(shù)起
N-: 從第N個(gè)字節(jié), 字符或字段直至行尾
N-M: 從第N到第M(并包括第M)個(gè)字節(jié), 字符或字段
-M: 從第1到第M(并包括第M)個(gè)字節(jié), 字符或字段
[root@localhost data]# echo 吃飯了嗎 >test.txt
[root@localhost data]# cat test.txt
吃飯了嗎
[root@localhost data]# cut -b -2 test.txt
[root@localhost data]# cut -b -3 test.txt
吃
[root@localhost data]# cut -nb -3 test.txt # -nb連用吃嘿,不分割多字節(jié)字符
吃飯了
[root@localhost data]# cat test.txt
1 2 3
4 5 6
7 8 9
[root@localhost data]# cat test.txt | tr " " :|cut -d: -f2 #用:代替空格作為分隔符祠乃,并用cut命令取出第二列內(nèi)容
2
5
8
[root@localhost data]# cat test.txt | tr " " :|cut -d: --complement -f2 #--complement 取反
1:3
4:6
7:9
paste命令可以將兩個(gè)文件合并為一個(gè)文件,默認(rèn)以行作為單位兑燥,文件中相同行的內(nèi)容合并為一行亮瓷。
[root@localhost data]# cat test.txt
1 2 3
4 5 6
7 8 9
[root@localhost data]# cat test2.txt
k l m
a b c
d e f
g h i
[root@localhost data]# paste test.txt test2.txt
1 2 3 k l m
4 5 6 a b c
7 8 9 d e f
g h i
[root@localhost data]# paste -d"#" test.txt test2.txt # -d:指定兩個(gè)文件的分割字符串
1 2 3#k l m
4 5 6#a b c
7 8 9#d e f
#g h i
[root@localhost data]# paste -s test.txt test2.txt # -s:先將文件內(nèi)容合并為一行,在進(jìn)行合并
1 2 3 4 5 6 7 8 9
k l m a b c d e f g h i
sort和uniq命令
sort命令可以按照一定的要求對(duì)文件所有的行進(jìn)行排序降瞳,默認(rèn)按照字母表順序排序嘱支,數(shù)字在字母前面。
sort命令常用選項(xiàng)說(shuō)明:
短參數(shù) | 長(zhǎng)參數(shù) | 說(shuō)明 |
---|---|---|
-n | – number-sort | 按字符串?dāng)?shù)值排序挣饥,與-g區(qū)別為不轉(zhuǎn)為浮點(diǎn)數(shù) |
-g | –general-number-sort | 按通用數(shù)值排序除师,支持科學(xué)計(jì)數(shù)法 |
-f | –ignore-case | 忽略大小寫,默認(rèn)大小寫字母不同 |
-k | –key=POS1[,POS2] | 排序從POS1開(kāi)始扔枫,若指定POS2汛聚,則POS2結(jié)束,否則以POS1排序 |
-t | –field-separator=SEP | 指定列的分割符 |
-r | –reverse | 降序排序短荐,默認(rèn)為升序 |
-h | –human-numeric-sort | 使用易讀性數(shù)字(例如: 2K 1G) |
-u | –unique | 去除重復(fù)的行 |
-o | –output=FILE | 將輸出寫入文件 |
[root@localhost data]# cat test.txt [root@localhost data]# sort test.txt
Avs 2vr #排序之后對(duì)比
SDV 7vf
2vr abc
swe ade
7vf Avs
ade SDV
abc swe
[root@localhost data]# sort -t: -k 3 /etc/passwd | head -n 3 #以:為分隔符倚舀,對(duì)第三列按字母順序排序
root:x:0:0:root:/root:/bin/bash
wufujie:x:1000:1000:myself,home,2013007,3454324:/home/wufujie:/bin/bash
test1:x:1001:1001::/home/test1:/bin/bash
[root@localhost data]# sort -t: -k 3 -nr /etc/passwd | head -n 3 #以:為分隔符,對(duì)第三列按數(shù)字大小倒序排序
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
wfj1:x:2005:2005::/home/wfj1:/bin/bash
wfj:x:2004:2004::/home/wfj:/bin/bash
[root@localhost data]# sort -R test2.txt # -R 表示隨機(jī)排序
[root@localhost data]# cut -d: -f7 /etc/passwd | sort -u # -u:排除相同的行搓侄,去重。
/bin/bash
/bin/sync
/bin/tcsh
/sbin/halt
/sbin/nologin
/sbin/shutdown
uniq命令
uniq命令可以對(duì)指定的文件生成報(bào)告信息和去重相鄰行重復(fù)行的內(nèi)容话速。
要注意的是:uniq 不會(huì)檢查重復(fù)的行讶踪,除非它們是相鄰的行。如果您想先對(duì)輸入排序泊交,使用沒(méi)有uniq 的"sort -u"乳讥。
uniq命令常用選項(xiàng)說(shuō)明:
短參數(shù) | 長(zhǎng)參數(shù) | 說(shuō)明 |
---|---|---|
-c | --count | 在每行前加上表示相應(yīng)行目出現(xiàn)次數(shù)的前綴編號(hào) |
-d | --repeated | 只輸出重復(fù)的行 |
-D | --all-repeated[=delimit-method | 顯示所有重復(fù)的行delimit-method={none(default),prepend,separate} 以空行為界限 |
-f | --skip-fields=N | 比較時(shí)跳過(guò)前N 列 |
-i | --ignore-case | 在比較的時(shí)候不區(qū)分大小寫 |
-s | --skip-chars=N | 比較時(shí)跳過(guò)前N 個(gè)字符 |
-u | --unique | 只顯示唯一的行 |
-z | --zero-terminated | 使用'\0'作為行結(jié)束符,而不是新?lián)Q行 |
-w | --check-chars=N | 對(duì)每行第N 個(gè)字符以后的內(nèi)容不作對(duì)照 |
--help | 顯示此幫助信息并退出 | |
--version | 顯示版本信息并退出 |
diff和patch命令
diff命令可以對(duì)比分析出兩個(gè)文件的不同之處廓俭,方便查看改動(dòng)過(guò)的位置和內(nèi)容云石。
[root@localhost data]# cat test.txt
123
234
345
[root@localhost data]# cat test2.txt
123
456
789
[root@localhost data]# diff test.txt test2.txt
2,3c2,3
< 234
< 345
---
> 456
> 789
我們來(lái)說(shuō)明一下該輸出結(jié)果的含義,要明白diff比較結(jié)果的含義研乒,我們必須牢記一點(diǎn)汹忠,diff描述兩個(gè)文件不同的方式是告訴我們?cè)趺礃痈淖兊谝粋€(gè)文件之后與第二個(gè)文件匹配。我們看看上面的比較結(jié)果中的第一行 2,3c2,3 前面的數(shù)字2,3表示第一個(gè)文件中的行,中間有一個(gè)字母c表示需要在第一個(gè)文件上做的操作(a=add,c=change,d=delete)宽菜,后面的數(shù)字2,3表示第二個(gè)文件中的行谣膳。
2,3c2,3 的含義是:第一個(gè)文件中的第[2,3]行(注意這是一個(gè)閉合區(qū)間,包括第2行和第3行)需要做出修改才能與第二個(gè)文件中的[2,3]行相匹配铅乡。
接下來(lái)的內(nèi)容則告訴我們需要修改的地方继谚,前面帶 < 的部分表示左邊文件的第[2,3]行的內(nèi)容,而帶> 的部分表示右邊文件的第[2,3]行的內(nèi)容阵幸,中間的 --- 則是兩個(gè)文件內(nèi)容的分隔符號(hào)花履。
[root@localhost data]# diff test.txt test2.txt -y -W 30 # -y:并排對(duì)比,-W:指定行寬度挚赊,| 表示兩個(gè)文件的不同之處
123 123
234 | 456
345 | 789
[root@localhost data]# diff -u test.txt test2.txt # -u:使用unified格式顯示
--- test.txt 2020-01-01 16:30:56.498139453 +0800 # -:表示第一個(gè)文件
+++ test2.txt 2020-01-01 16:38:36.734143355 +0800 # +:表示第二個(gè)文件
@@ -1,3 +1,3 @@ # -1,3:表示第一個(gè)文件的第1到第3行诡壁,+1,3:表示第二個(gè)文件的第1到第3行
123
-234 # -開(kāi)頭的行表示從第一個(gè)文件刪除此行可以得到第二個(gè)文件
-345
+456 # +開(kāi)頭的行表示從第一個(gè)文件增加此行可以得到第二個(gè)文件
+789
patch命令
patch命令讓用戶利用設(shè)置修補(bǔ)文件的方式咬腕,修改,更新原始文件涨共。,結(jié)合diff的輸出unified格式信息和兩個(gè)文件的任意一個(gè)举反,就可以生成另一個(gè)文件。
[root@localhost data]# diff -u test.txt test2.txt >diff.log #patch還原文件
[root@localhost data]# ls
diff.log ping test2.txt test.txt
[root@localhost data]# rm -f test2.txt
[root@localhost data]# ls
diff.log ping test.txt
[root@localhost data]# patch -b test.txt diff.log
patching file test.txt
[root@localhost data]# ls
diff.log ping test.txt test.txt.orig
[root@localhost data]# cat test.txt.orig
123
234
345
[root@localhost data]# cat test.txt
123
456
789