Linux下常用文本處理命令大全
目前創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)絡空間、網(wǎng)站托管、服務器租用、企業(yè)網(wǎng)站設計、射陽網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
Linux下面有很多經(jīng)典的非常有用的命令,其中處理文本的命令就有很多。下面就讓我們一起看看這些經(jīng)典的Linux文本處理命令有哪些吧。
一. sort
文件排序, 通常用在管道中當過濾器來使用. 這個命令可以依據(jù)指定的關鍵字或指定的字符位置, 對文件行進行排序. 使用-m選項, 它將會合并預排序的輸入文件. 想了解這個命令的全部參數(shù)請參考這個命令的info頁.
二. tsort
拓撲排序, 讀取以空格分隔的有序對, 并且依靠輸入模式進行排序.
三. uniq
這個過濾器將會刪除一個已排序文件中的重復行. 這個命令經(jīng)常出現(xiàn)在sort命令的管道后邊.
四. expand, unexpand
expand命令將會把每個tab轉化為一個空格. 這個命令經(jīng)常用在管道中.
unexpand命令將會把每個空格轉化為一個tab. 效果與expand命令相反.
五. cut
一個從文件中提取特定域的工具. 這個命令與awk中使用的print $N命令很相似, 但是更受限. 在腳本中使用cut命令會比使用awk命令來得容易一些. 最重要的選項就是-d(字段定界符)和-f(域分隔符)選項.
六. paste
將多個文件, 以每個文件一列的形式合并到一個文件中, 合并后文件中的每一列就是原來的一個文件. 與cut結合使用, 經(jīng)常用于創(chuàng)建系統(tǒng)log文件.
七. join
這個命令與paste命令屬于同類命令. 但是它能夠完成某些特殊的目地. 這個強力工具能夠以一種特殊的形式來合并兩個文件, 這種特殊的形式本質上就是一個關聯(lián)數(shù)據(jù)庫的簡單版本.
join命令只能夠操作兩個文件. 它可以將那些具有特定標記域(通常是一個數(shù)字標簽)的行合并起來, 并且將結果輸出到stdout. 被加入的文件應該事先根據(jù)標記域進行排序以便于能夠正確的匹配.
八. head
把文件的頭部內容打印到stdout上(默認為10行, 可以自己修改). 這個命令有一些比較有趣的選項.
九. tail
將一個文件結尾部分的內容輸出到stdout中(默認為10行). 通常用來跟蹤一個系統(tǒng)logfile的.修改情況, 如果使用-f選項的話, 這個命令將會繼續(xù)顯示添加到文件中的行.
十. wc
wc可以統(tǒng)計文件或I/O流中的”單詞數(shù)量”:
十一. fold
將輸入按照指定寬度進行折行. 這里有一個非常有用的選項-s, 這個選項可以使用空格進行斷行(譯者: 事實上只有外文才需要使用空格斷行, 中文是不需要的)(請參考例子 12-23和例子 A-1).
十二. fmt
一個簡單的文件格式器, 通常用在管道中, 將一個比較長的文本行輸出進行”折行”.
十三. col
這個命令用來濾除標準輸入的反向換行符號. 這個工具還可以將空白用等價的tab來替換. col工具最主要的應用還是從特定的文本處理工具中過濾輸出, 比如groff和tbl. (譯者: 主要用來將man頁轉化為文本.)
十四. column
列格式化工具. 通過在合適的位置插入tab, 這個過濾工具會將列類型的文本轉化為”易于打印”的表格式進行輸出.
十五. colrm
列刪除過濾器. 這個工具將會從文件中刪除指定的列(列中的字符串)并且寫到文件中, 如果指定的列不存在, 那么就回到stdout. colrm 2 4 filename將會刪除filename文件中每行的第2到第4列之間的所有字符. p="" /filename將會刪除filename文件中每行的第2到第4列之間的所有字符.
Caution: 如果這個文件包含tab和不可打印字符, 那將會引起不可預期的行為. 在這種情況下, 應該通過管道的手段使用expand和unexpand來預處理colrm.
十六. nl
計算行號過濾器. nl filename將會把filename文件的所有內容都輸出到stdout上, 但是會在每個非空行的前面加上連續(xù)的行號. 如果沒有filename參數(shù), 那么就操作stdin.
nl命令的輸出與cat -n非常相似, 然而, 默認情況下nl不會列出空行.
十七. pr
格式化打印過濾器. 這個命令會將文件(或stdout)分頁, 將它們分成合適的小塊以便于硬拷貝打印或者在屏幕上瀏覽. 使用這個命令的不同的參數(shù)可以完成好多任務, 比如對行和列的操作, 加入行, 設置頁邊, 計算行號, 添加頁眉, 合并文件等等. pr命令集合了許多命令的功能, 比如nl, paste, fold, column, 和expand.
pr -o 5 –width=65 fileZZZ | more 這個命令對fileZZZ進行了比較好的分頁, 并且打印到屏幕上. 文件的縮進被設置為5, 總寬度設置為65.
一個非常有用的選項-d, 強制隔行打印(與sed -G效果相同).
十八. gettext
GNU gettext包是專門用來將程序的輸出翻譯或者本地化為不同國家語言的工具集. 在最開始的時候僅僅支持C語言, 現(xiàn)在已經(jīng)支持了相當數(shù)量的其它程序語言和腳本語言.
想要查看gettext程序如何在shell腳本中使用. 請參考info頁.
十九. msgfmt
一個產生二進制消息目錄的程序. 這個命令主要用來本地化.
二十. iconv
一個可以將文件轉化為不同編碼格式(字符集)的工具. 這個命令主要用來本地化.
二十一. recode
可以認為這個命令是上邊iconv命令的專業(yè)版本. 這個非常靈活的并可以把整個文件都轉換為不同編碼格式的工具并不是Linux標準安裝的一部分.
二十二. TeX, gs
TeX和Postscript都是文本標記語言, 用來對打印和格式化的視頻顯示進行預拷貝.
TeX是Donald Knuth精心制作的排版系統(tǒng). 通常情況下, 通過編寫腳本的手段來把所有的選項和參數(shù)封裝起來一起傳到標記語言中是一件很方便的事情.
col命令是Linux下的一個文檔編輯命令,其英文全稱是colation,翻譯過來就是過濾,col命令主要有一個功能,能夠在許多說明文件里有效地過濾控制字符。
說明:col命令就相當于一個標準輸入文本過濾器,它會從標注輸入設備內讀取文本內容,并且將內容顯示到標注輸出設備。
在許多Unix說明文件里,都有RLF控制字符。當我們運用shell特殊字符或,把說明文件的內容輸出成純文本文件時,控制字符會變成亂碼,col指令則能有效濾除這些控制字符。
語法
col [-bfx][-l緩沖區(qū)列數(shù)]
參數(shù)
-b:過濾掉所有的控制字符,包括RLF和HRLF。
-f:濾除RLF字符,但允許將HRLF字符呈現(xiàn)出來。
-x:以多個空格字符來表示跳格字符。
-l緩沖區(qū)列數(shù):預設的內存緩沖區(qū)有128列,您可以自行指定緩沖區(qū)的大小。
Linux常用指令---grep(搜索過濾) (轉)
Linux系統(tǒng)中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹?配的行打印出來。grep全稱是Global?Regular?Expression?Print,表示全局正則表達式版本,它的使用權限是所有用戶。
grep的工作方式是這樣的,它在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板后的所有字符串被看作文件名。搜索的結果被送到標準輸出,不影響原文件內容。
grep可用于shell腳本,因為grep通過返回一個狀態(tài)值來說明搜索的狀態(tài),如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。
1.命令格式:
grep?[option]?pattern?file
2.命令功能:
用于過濾/搜索的特定字符??墒褂谜齽t表達式能多種命令配合使用,使用上十分靈活。
3.命令參數(shù):
-a???--text???#不要忽略二進制的數(shù)據(jù)。???
-A顯示行數(shù)???--after-context=顯示行數(shù)???#除了顯示符合范本樣式的那一列之外,并顯示該行之后的內容。???
-b???--byte-offset???#在顯示符合樣式的那一行之前,標示出該行第一個字符的編號。???
-B顯示行數(shù)???--before-context=顯示行數(shù)???#除了顯示符合樣式的那一行之外,并顯示該行之前的內容。???
-c????--count???#計算符合樣式的列數(shù)。???
-C顯示行數(shù)????--context=顯示行數(shù)或-顯示行數(shù)???#除了顯示符合樣式的那一行之外,并顯示該行之前后的內容。???
-d?動作??????--directories=動作???#當指定要查找的是目錄而非文件時,必須使用這項參數(shù),否則grep指令將回報信息并停止動作。???
-e范本樣式??--regexp=范本樣式???#指定字符串做為查找文件內容的樣式。???
-E??????--extended-regexp???#將樣式為延伸的普通表示法來使用。???
-f規(guī)則文件??--file=規(guī)則文件???#指定規(guī)則文件,其內容含有一個或多個規(guī)則樣式,讓grep查找符合規(guī)則條件的文件內容,格式為每行一個規(guī)則樣式。???
-F???--fixed-regexp???#將樣式視為固定字符串的列表。???
-G???--basic-regexp???#將樣式視為普通的表示法來使用。???
-h???--no-filename???#在顯示符合樣式的那一行之前,不標示該行所屬的文件名稱。???
-H???--with-filename???#在顯示符合樣式的那一行之前,表示該行所屬的文件名稱。???
-i????--ignore-case???#忽略字符大小寫的差別。???
-l????--file-with-matches???#列出文件內容符合指定的樣式的文件名稱。???
-L???--files-without-match???#列出文件內容不符合指定的樣式的文件名稱。???
-n???--line-number???#在顯示符合樣式的那一行之前,標示出該行的列數(shù)編號。???
-q???--quiet或--silent???#不顯示任何信息。???
-r???--recursive???#此參數(shù)的效果和指定“-d?recurse”參數(shù)相同。???
-s???--no-messages???#不顯示錯誤信息。???
-v???--revert-match???#顯示不包含匹配文本的所有行。???
-V???--version???#顯示版本信息。???
-w???--word-regexp???#只顯示全字符合的列。???
-x????--line-regexp???#只顯示全列符合的列。???
-y???#此參數(shù)的效果和指定“-i”參數(shù)相同。
4.規(guī)則表達式:
grep的規(guī)則表達式:
^??#錨定行的開始?如:'^grep'匹配所有以grep開頭的行。????
$??#錨定行的結束?如:'grep$'匹配所有以grep結尾的行。????
.??#匹配一個非換行符的字符?如:'gr.p'匹配gr后接一個任意字符,然后是p。????
*??#匹配零個或多個先前字符?如:'*grep'匹配所有一個或多個空格后緊跟grep的行。????
.*???#一起用代表任意字符。???
[]???#匹配一個指定范圍內的字符,如'[Gg]rep'匹配Grep和grep。????
[^]??#匹配一個不在指定范圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行。????
\(..\)??#標記匹配字符,如'\(love\)',love被標記為1。????
\??????#錨定單詞的開始,如:'\
\??????#錨定單詞的結束,如'grep\'匹配包含以grep結尾的單詞的行。????
x\{m\}??#重復字符x,m次,如:'0\{5\}'匹配包含5個o的行。????
x\{m,\}??#重復字符x,至少m次,如:'o\{5,\}'匹配至少有5個o的行。????
x\{m,n\}??#重復字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10個o的行。???
\w????#匹配文字和數(shù)字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零個或多個文字或數(shù)字字符,然后是p。???
\W????#\w的反置形式,匹配一個或多個非單詞字符,如點號句號等。???
\b????#單詞鎖定符,如:?'\bgrep\b'只匹配grep。??
POSIX字符:
為了在不同國家的字符編碼中保持一至,POSIX(The?Portable?Operating?System?Interface)增加了特殊的字符類,如[:alnum:]是[A-Za-z0-9]的另一個寫法。要把它們放到[]號內才能成為正則表達式,如[A-?Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符類。
[:alnum:]????#文字數(shù)字字符???
[:alpha:]????#文字字符???
[:digit:]????#數(shù)字字符???
[:graph:]????#非空字符(非空格、控制字符)???
[:lower:]????#小寫字符???
[:cntrl:]????#控制字符???
[:print:]????#非空字符(包括空格)???
[:punct:]????#標點符號???
[:space:]????#所有空白字符(新行,空格,制表符)???
[:upper:]????#大寫字符???
[:xdigit:]???#十六進制數(shù)字(0-9,a-f,A-F)??
5.使用實例:
實例1:查找指定進程
命令:
ps?-ef|grep?svn
輸出:
[root@localhost?~]#?ps?-ef|grep?svn
root?4943???1??????0??Dec05?????00:00:00?svnserve?-d?-r?/opt/svndata/grape/
root?16867?16838??0?19:53?pts/0????00:00:00?grep?svn
[root@localhost?~]#
說明:
第一條記錄是查找出的進程;第二條結果是grep進程本身,并非真正要找的進程。
實例2:查找指定進程個數(shù)
命令:
ps?-ef|grep?svn?-c
ps?-ef|grep?-c?svn
輸出:
[root@localhost?~]#?ps?-ef|grep?svn?-c
2
[root@localhost?~]#?ps?-ef|grep?-c?svn?
2
[root@localhost?~]#
說明:
實例3:從文件中讀取關鍵詞進行搜索
命令:
cat?test.txt?|?grep?-f?test2.txt
輸出:
[root@localhost?test]#?cat?test.txt?
hnlinux
peida.cnblogs.com
ubuntu
ubuntu?linux
redhat
Redhat
linuxmint
[root@localhost?test]#?cat?test2.txt?
linux
Redhat
[root@localhost?test]#?cat?test.txt?|?grep?-f?test2.txt
hnlinux
ubuntu?linux
Redhat
linuxmint
[root@localhost?test]#
說明:
輸出test.txt文件中含有從test2.txt文件中讀取出的關鍵詞的內容行
實例3:從文件中讀取關鍵詞進行搜索?且顯示行號
命令:
cat?test.txt?|?grep?-nf?test2.txt
輸出:
[root@localhost?test]#?cat?test.txt?
hnlinux
peida.cnblogs.com
ubuntu
ubuntu?linux
redhat
Redhat
linuxmint
[root@localhost?test]#?cat?test2.txt?
linux
Redhat
[root@localhost?test]#?cat?test.txt?|?grep?-nf?test2.txt
1:hnlinux
4:ubuntu?linux
6:Redhat
7:linuxmint
[root@localhost?test]#
說明:
輸出test.txt文件中含有從test2.txt文件中讀取出的關鍵詞的內容行,并顯示每一行的行號
實例5:從文件中查找關鍵詞
命令:
grep?'linux'?test.txt
輸出:
[root@localhost?test]#?grep?'linux'?test.txt?
hnlinux
ubuntu?linux
linuxmint
[root@localhost?test]#?grep?-n?'linux'?test.txt?
1:hnlinux
4:ubuntu?linux
7:linuxmint
[root@localhost?test]#
說明:
實例6:從多個文件中查找關鍵詞
命令:
grep?'linux'?test.txt?test2.txt
輸出:
[root@localhost?test]#?grep?-n?'linux'?test.txt?test2.txt?
test.txt:1:hnlinux
test.txt:4:ubuntu?linux
test.txt:7:linuxmint
test2.txt:1:linux
[root@localhost?test]#?grep?'linux'?test.txt?test2.txt?
test.txt:hnlinux
test.txt:ubuntu?linux
test.txt:linuxmint
test2.txt:linux
[root@localhost?test]#
說明:
多文件時,輸出查詢到的信息內容行時,會把文件的命名在行最前面輸出并且加上":"作為標示符
實例7:grep不顯示本身進程
命令:
ps?aux|grep?\[s]sh
ps?aux?|?grep?ssh?|?grep?-v?"grep"
輸出:
[root@localhost?test]#?ps?aux|grep?ssh
root???2720??0.0??0.0??62656??1212????????Ss???Nov02???0:00?/usr/sbin/sshd
root??16834??0.0??0.0??88088??3288????????Ss???19:53???0:00?sshd:?root@pts/0?
root??16901??0.0??0.0??61180???764?pts/0??S+???20:31???0:00?grep?ssh
[root@localhost?test]#?ps?aux|grep?\[s]sh]
[root@localhost?test]#?ps?aux|grep?\[s]sh
root???2720??0.0??0.0??62656??1212????????Ss???Nov02???0:00?/usr/sbin/sshd
root??16834??0.0??0.0??88088??3288????????Ss???19:53???0:00?sshd:?root@pts/0?
[root@localhost?test]#?ps?aux?|?grep?ssh?|?grep?-v?"grep"
root???2720??0.0??0.0??62656??1212????????Ss???Nov02???0:00?/usr/sbin/sshd
root??16834??0.0??0.0??88088??3288????????Ss???19:53???0:00?sshd:?root@pts/0
說明:
實例8:找出已u開頭的行內容
命令:
cat?test.txt?|grep?^u
輸出:
[root@localhost?test]#?cat?test.txt?|grep?^u
ubuntu
ubuntu?linux
[root@localhost?test]#
說明:
實例9:輸出非u開頭的行內容
命令:
cat?test.txt?|grep?^[^u]
輸出:
[root@localhost?test]#?cat?test.txt?|grep?^[^u]
hnlinux
peida.cnblogs.com
redhat
Redhat
linuxmint
[root@localhost?test]#
說明:
實例10:輸出以hat結尾的行內容
命令:
cat?test.txt?|grep?hat$
輸出:
[root@localhost?test]#?cat?test.txt?|grep?hat$
redhat
Redhat
[root@localhost?test]#
說明:
實例11:輸出ip地址
命令:
ifconfig?eth0|grep?-E?"([0-9]{1,3}\.){3}[0-9]"
輸出:
[root@localhost?test]#?ifconfig?eth0|grep?"[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
inet?addr:192.168.120.204??Bcast:192.168.120.255??Mask:255.255.255.0
[root@localhost?test]#?ifconfig?eth0|grep?-E?"([0-9]{1,3}\.){3}[0-9]"
inet?addr:192.168.120.204??Bcast:192.168.120.255??Mask:255.255.255.0
[root@localhost?test]#
說明:
實例12:顯示包含ed或者at字符的內容行
命令:
cat?test.txt?|grep?-E?"ed|at"
輸出:
[root@localhost?test]#?cat?test.txt?|grep?-E?"peida|com"
peida.cnblogs.com
[root@localhost?test]#?cat?test.txt?|grep?-E?"ed|at"
redhat
Redhat
[root@localhost?test]#
說明:
實例13:顯示當前目錄下面以.txt?結尾的文件中的所有包含每個字符串至少有7個連續(xù)小寫字符的字符串的行
命令:
grep?'[a-z]\{7\}'?*.txt
輸出:
[root@localhost?test]#?grep?'[a-z]\{7\}'?*.txt
test.txt:hnlinux
test.txt:peida.cnblogs.com
test.txt:linuxmint
[root@localhost?test]#
實例14:日志文件過大,不好查看,我們要從中查看自己想要的內容,或者得到同一類數(shù)據(jù),比如說沒有404日志信息的
命令:
grep?'.'?access1.log|grep?-Ev?'404'??access2.log
grep?'.'?access1.log|grep?-Ev?'(404|/photo/|/css/)'??access2.log
grep?'.'?access1.log|grep?-E?'404'??access2.log
輸出:
[root@localhost?test]#?grep?“.”access1.log|grep?-Ev?“404”??access2.log
說明:上面3句命令前面兩句是在當前目錄下對access1.log文件進行查找,找到那些不包含404的行,把它們放到access2.log中,后面去掉’v’,即是把有404的行放入access2.log
xargs 是給命令傳遞參數(shù)的一個過濾器,也是組合多個命令的一個工具,它能夠捕獲一個命令的輸出,然后傳遞給另外一個命令。之所以會用到這個命令,關鍵是由于 很多命令不支持管道來傳遞參數(shù) ,而日常工作中就有這個需要,所以就有了 xargs 命令。
我們經(jīng)常會用grep命令在文件中查找需要的內容,比如現(xiàn)在一個文件夾里面有9個文件,有三種格式txt, csv和gz壓縮文件。
123里面存的內容都一樣為
456里面存的內容也一樣為
789里面存的都是
如果我現(xiàn)在要從所有的文件里面找“apple”
我會得到下面的結果,你會發(fā)現(xiàn) grep不能從gz文件中查找內容
zgrep 這個命令可以解決這個問題,這樣就不需要先解壓然后再去查找了
會得到如下結果,顯示了所有文件格式中找到的“apple”,并且顯示了匹配的行號
如果只想在符合某種特征的文件中找你感興趣的內容呢?比如在文件名中包含123的文件中查找“apple”。這時候就需要管道了,你需要先找到這樣的文件然后再從中找“apple”
第一步找到名字中包含123的文件
會得到文件名中包含123的所有文件
第二步查找“apple”
然后我們再來從中找“apple”,你會發(fā)現(xiàn)下面這條命令不work,你啥都得不到
這就是我們開篇提到的, 很多命令不支持管道來傳遞參數(shù)。 這個時候 xargs 就派上用場了
同時用上 zgrep ,這樣gz文件也一起找了
那么,如果我們想從某一種特定格式的文件中(比如csv文件)找特定的內容該怎么做呢?大家應該能觸類旁通,舉一反三了吧!
Linux xargs grep zgrep命令