文本處理工具一
一、雜項知識整理
1、ps axo user,ruser,cmd 查看命令發起者的身份和真正的登錄身份:
[root@localhost test]# ps axo user,ruser,cmd USER RUSER CMD root root /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root root [kthreadd] root root [ksoftirqd/0] root root [kworker/0:0H] root root [migration/0] root root [rcu_bh] root root [rcuob/0] root root [rcuob/1]
2、windows文本在Linux中,回車為^M$,linux文本中tab在文本當中表示為^I。
cat -n 加行號
-b 非空行編號
-s 壓縮連續的空行成一行
[root@localhost test]# cat -s test.txt abbcc abc ccabb abc dd acbabc aaccbbabcacbabc abbccdba c bbb aaa ccc 123456 abc123
-A 顯示所有的控制符
-E 顯示行結束符$
3、root的umask較大因此創建的文件權限較小,是為了限制其它用戶訪問。root可以隨時更改自己的umask。
4、rev命令:每行的內容反向:
[root@localhost test]# rev test.txt bbacc cba ccbba dd cba cbabca cbabcacbabbccaa c abdccbba bbb aaa ccc 654321 321cba
5、suid和sgid作用于二進制程序上有效,sgid可以作用于目錄。echo為內置命令,使用sgid時不能與一般的二進制程序相同。
6、perl語言的發明人,拉里.沃爾,發明diff命令。awk是三個發明人的姓名首字母。
二、命令詳解及事例
今天學習了文本處理工具,包括wc,cut,sort,more,less,uniq,diff,patch,rev,head,tail,grep,egrep以及fgrep。我們在/testdir中建立一個文件test.txt內容如下,來實現今天許多文本處理工具的一些命令演示,以加強認識。
[root@localhost test]# cat test.txt abbcc abc ccabb abc dd acbabc aaccbbabcacbabc abbccdbac bbb aaa ccc 123456 abc123
1、關于more:查看文件內容或者接收標準輸入的內容,只能往下翻頁,到底便退出,操作是回車一行一行查看,回車翻頁。也可以通過管道接收文件列表。
2、less:查看文本信息,man默認調用的工具。同樣可以接收文件列表。快捷鍵:空格翻屏,回車下一行,f翻屏,d翻半屏,u往上翻半屏,n默認翻三行,g回到頂部,q退出。
3、head命令:獲取前幾行的內容,默認為十行。
-c # 指定獲取前#字節
-n # 指定獲取前#行 與 -# 指定行數相同:
[root@localhost test]# head test.txt abbcc abc ccabb abc dd acbabc aaccbbabcacbabc abbccdba c bbb aaa [root@localhost test]# head -c 20 test.txt abbcc abc ccabb abc [root@localhost test]# head -n3 test.txt abbcc abc ccabb abc dd acbabc [root@localhost test]# head -3 test.txt abbcc abc ccabb abc dd acbabc
4、tail命令:與head命令基本相反:顯示后幾行內容,比head更要常用。
-c # 指定獲取后#字節
-n # 指定獲取后#行 與 -#相同
-f 跟蹤顯示文件新追加的內容,常用于日志監控:操作如下:找到日志文件執行命令,放入后臺執行:
[root@centos68 testdir]# tail -n0 -f aaa.log & [1] 4180
在另一個終端執行任務改變了文件時,后臺執行任務的終端就會出現新行信息但不影響操作:
[root@centos68 testdir]# echo "aaa" >> aaa.log (console1) [root@centos68 testdir]# aaa(console2)
關閉后臺任務:
[root@centos68 testdir]# fg %1 tail -n0 -f aaa.log ^C
5、cut命令:
-d 分隔符 : 指明分隔符,默認tab
-f # :第幾個字段,可以是好幾段如:-f1,3,5-10
-c 按字符切割 –output=delimiter=STRINGG指定輸出分隔符
[root@localhost test]# cut -db -f 1,3 test.txt --output-delimiter=: a:cc a a ac:c aacc:a a:ccd : aaa ccc 123456 a [root@localhost test]# cut -c 2-4 test.txt bbc bc cba acc bbc bb aa cc 234 bc1
6、paste命令(粘貼):合并兩個文件同行號的列到一行:
-d 分隔符:指定分隔符,默認用tab
-s 所有行合成一行顯示:每個文件自己的行合成
[root@localhost test]# paste -d: aaa.log test.txt abc:abbcc abc ccabb abc:abc dd abc:acbabc abc: adfasdfadsf: adfasdfadsf:aaccbbabcacbabc [root@localhost test]# paste -s aaa.log test.txt abcabcabcabcadfasdfadsfadfasdfadsf abbcc abc ccabbabc dd acbabc aaccbbabcacbabcabbccdba cbbbaaa ccc 123456abc123
7、wc命令:計數單詞總數、行總數、字節總數和字符總數:可以對文件或STDIN(標準輸入)中的數據運行:
-l 只計數行數
-w 只計數單詞總數
-c 只計數字節總數
-m 只計數字符總數
[root@localhost test]# wc aaa.log 6 6 40 aaa.log [root@localhost test]# wc -l aaa.log 6 aaa.log [root@localhost test]# wc -w aaa.log 6 aaa.log [root@localhost test]# wc -c aaa.log 40 aaa.log [root@localhost test]# wc -m aaa.log 40 aaa.log
8、sort命令:把整理過的文本顯示在標準輸出(STDOUT),不改變原始文件。
-r 反向整理
-n 按數字大小整理
-f (fold)選項忽略字符串中的字符大小寫
-u 選項刪除輸出中的重復行,例子中其實是有空行的,多行空行被刪除只留了一行
-t # 選項使用#作為字段界定符(文件中有的,類似cut -d)
-k N 選項按照使用#字符分隔的N列來整理,默認字符順序排序。
[root@localhost test]# sort -r test.txt ccc bbb acbabc abc dd abc123 abbccdba c abbcc abc ccabb aaccbbabcacbabc aaa 123456 [root@localhost test]# sort -n test.txt aaa aaccbbabcacbabc abbcc abc ccabb abbccdba c abc123 abc dd acbabc bbb ccc 123456 [root@localhost test]# sort -f test.txt 123456 aaa aaccbbabcacbabc abbcc abc ccabb abbccdba c abc dd abc123 acbabc bbb ccc [root@localhost test]# sort -u test.txt 123456 aaa aaccbbabcacbabc abbcc abc ccabb abbccdba c abc123 abc dd acbabc bbb ccc [root@localhost test]# sort -t: -k 3 -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 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@localhost test]# sort -t: -k 3 -nr /etc/passwd bash:x:2231:2231::/home/bash:/bin/bash tom:x:2230:3003::/home/tom:/bin/bash alice:x:2229:3002::/home/alice:/bin/bash user6:x:2228:2228::/home/user6:/bin/bash user5:x:2227:2227::/home/user5:/bin/bash user4:x:2226:2226::/home/user4:/bin/bash user3:x:2225:2225::/home/user3:/bin/bash user2:x:2224:2224::/home/user2:/bin/bash user1:x:2223:2223::/home/user1:/bin/bash sarah:x:1008:1010::/home/sarah:/bin/nologin harry:x:1007:1009::/home/harry:/bin/bash natasha:x:1006:1008::/home/natasha:/bin/bash gentoo:x:1005:1006:gentoo distribution:/home/gentoo:/
9、uniq命令:從輸入中刪除重復的前后相接的行:
-c 顯示每行重復出現的次數
-d 僅顯示重復過的行
-u 僅顯示不重復的行
常和sort一起配合使用
[root@localhost test]# uniq -c test.txt 1 abbcc abc ccabb 1 abc dd 1 acbabc 1 1 aaccbbabcacbabc 1 1 abbccdba c 3 bbb 1 aaa 1 1 aaa 1 ccc 1 123456 1 abc123 [root@localhost test]# uniq -d test.txt bbb [root@localhost test]# uniq -u test.txt abbcc abc ccabb abc dd acbabc aaccbbabcacbabc abbccdba c aaa aaa ccc 123456
10、diff命令,比較文件。
[root@localhost test]# diff test.txt test1.txt 2c2 < --- > abc dd 3a4 > 6a8 > bbb
diff用于恢復文件,同時使用patch,需要事先用命令-u(unified統一的)將diff比較后的結果輸出至文件。
[root@localhost test]# diff -u test.txt test1.txt > testbak.txt [root@localhost test]# rm -f test1.txt [root@localhost test]# patch -b test.txt aaa.log testbak.txt test.txt [root@localhost test]# patch -b test.txt testbak.txt patching file test.txt [root@localhost test]# ls aaa.log testbak.txt test.txt test.txt.orig
首先將對比后的結果輸入備份文件,diff -u FILE(BROKEN) FILE(WORKS) > FILE.PATCH
然后恢復原WORK文件:diff -b FILE(BROKEN) FILE.PATCH
三、練習及作業
1、統計/etc/init.d/functions中的每個單詞的使用次數:一部分結果:
[root@centos68 testdir]# cat /etc/init.d/functions |tr -cs [:alpha:] '\n'|sort |uniq -c 1 31 a 5 A 1 aA 2 above 12 action 2 all 16 ALL 2 ALLNETDEVMTAB 2 already 1 an 5 and 1 And 5 answer 3 any 1 anywhere 1 apply 1 Apply 4 are 8 arg 1 args 1 as 1 ask 2 at 1 avoid 23 awk 14 b 3 back 1 backup 2 bak 36 base
此命令中:tr -sc 是取補集c和合并所有空行為一行。[:alpha:]不能寫為[[]]的原因:兩個括號代表至匹配一個字符,連續出現好幾個特殊字符的情況就不會成功,一個括號代表通配,指所有的。BUG:出現S.U.S.E.這種單詞會被拆為四個單詞。
原創文章,作者:SilencePavilion,如若轉載,請注明出處:http://www.www58058.com/28994