Linux 經常使用命令用法:cat, find, xargs, tr, grep, cut, sed

本文列明Linux的經常使用命令用法,學會了這些命令以後,結合shell編程知識,就能夠作各類自動編譯/集成的工做啦。
本文地址:http://www.javashuo.com/article/p-bkarbrbm-dm.htmlhtml

Reference

《Linux Shell 腳本攻略》
Linux中怎麼找出空文件夾?git

cat:顯示、拼接

cat file1 file2 file3 ...

除了常有的用來顯示文件內容以外,cat有兩個妙用:正則表達式

1. 使用 stdin 輸入給 cat

xxxx | cat - output.txt

本例中使用「-」表示stdin,用xxxx命令的輸出重定向給catshell

2. 合併文件

cat file1 | file2 > output.txt

將兩個文本合併編程

3. 刪除多餘的空白行

cat -s input.txt

4. 顯示行號

cat -n input.txt

find:查找文件

基本用法:file -name 'xxx'。其中能夠指定文件夾,好比find /dev/ -name ...。在BSD中,目標文件夾是必須指定的。在Linux中,則能夠不指定,默認是當前文件夾。
若是要求忽略大小寫,則使用選項-iname。name參數後面的字符串可使用正則表達式。segmentfault

匹配多個文件

可使用-o選項來表示「OR」,而且用「\(」和「\)」做爲條件總體括起來。如:socket

find \(-name 'aaa.txt' -o -name 'aaa.doc' \)

須要注意的是,\(以後和\)以前必須有空格svn

不是匹配文件名而是匹配完整路徑

-name用於匹配文件名,可是可使用-path用來匹配路徑:函數

find ./ -path "*/doc/*"

若是要匹配正則表達式路徑,則使用-regex-iregex(忽略大小寫)。此時已path而不是name方式搜尋。code

指定「非」條件

能夠指定「不」匹配條件,使用感嘆號便可,如:

find ./ ! -name "*.txt"

限制目錄深度

-maxdepth-mindepth,好比搜尋當前文件夾,則使用-maxdepth 1

按照類型權限搜索

-perm mode/+mode/-mode。其中mode是一個八進制數,對應chmod命令裏面的mode。加號表示「任意一個位」,減號表示「全部1位匹配」,無符號表示「完整匹配」

過濾文件類型

find能夠匹配文件類型:-type x,其中x能夠是如下值:

  • f:file,文件
  • l:link,符號連接
  • d:directory,目錄/文件夾
  • c:char,字符設備
  • b:block,塊設備
  • s:socket
  • p:pipe

過濾文件時間

參數都是如下格式:-選項 天數,天數表示距離今天幾天內。選項以下:

  • -atime:access time
  • -mtime:modification time
  • -ctime:change time(注:這個和mtime有啥區別?)
    須要注意的是,UNIX中並無「create time」的概念。

好比搜索7天內訪問過的全部文件:find . -type f -atime -7
或者是訪問超過7天的文件:find . -type f -atime +7
也能夠是剛好7天:find . -type f -atime 7

上述參數是以天爲單位的。下面幾個參數以分鐘爲單位:
-amin, -mmin, -cmim

過濾文件大小

-size 參數
後面的參數能夠用多種單位,好比c(char,字節)、kMG。好比查找大於2kB的文件:
find . -type f -size +2k

刪除匹配的文件

在find命令後面加上-delete參數,find會將匹配到的文件都刪除掉。這個功能頗有用,可是要當心用。

對每個文件執行操做

使用-exec對find的每個目標進行操做,使用「{}」匹配每個文件名。好比將全部帶「configure」的文件加上執行權限:
find . -name "configure" -type f -exec chmod +x {}

說實話我以爲還不如使用xargs來得方便。

指定輸出的分隔符

使用-print0,將\0做爲文件名之間的分割符。參見xargs的使用。

查找全部空文件夾

find . -type d -empty

這是我在吧項目從svn遷移到git所遇到的問題——git不支持空文件夾啊……因此我得找到全部的空文件夾再作特殊處理。

xargs:將stdin轉換爲其餘命令的參數並執行

有些命令能夠支持stdin重定向做爲輸入,這是極好的。可是大部分不行。這個時候就須要使用xargs了。。
這個命令的做用就是將stdout的內容,做爲其餘命令的參數進行調用。基本格式是:

command | xargs ...

將stdout參數順序輸出給命令

最簡單的應用是將stdout一個一個輸出給命令,以換行符爲單位,好比:
find -name ".svn" | xargs rm -rf
這樣的結果是find輸出的每一行都被執行了rm -rf ...操做。

第二種應用是指定參數個數,好比:
find -name "*.txt" | xargs -n 2 cat
使用-n參數,xargs能夠每次傳遞指定數量的參數給command,若是參數不足,則傳遞剩餘所有參數。

指定參數位置

使用-I參數指定一個字符串做爲宏,而且在後面這個宏出現的位置中,替換成參數。在一些xargs實現中,-I參數是必需的。好比:
find -name ".svn" | xargs -I {} rm {} -rf

結合 find 命令

find命令的分隔符除了多是'\n 以外,也多是' '(空格)。爲了防止錯誤,find應該使用-print0選項,而xargs使用-0(槓零) 選項。好比:
find -name ".svn" -print0 | xargs -0 rm -rf

tr:轉換字符串,並從新輸出(translate)

tr [options] set1 set2

這是一個簡易的命令。tr將stdin的字符從set1的規則映射爲set2規則,而後從新輸出到stdout。好比將所有字母小寫:...... | tr 'A-Z' 'a-z'
set1和set2分別是兩個集合,好比'a-z', 'a-z0-9', '12345'等等都是合法集合。集合中也可使用轉義字符,好比\t, \n
使用tr刪除字符,用-d選項:...... | tr -d '0-9'
使用tr壓縮連續字符(典型應用:刪除連續空格):-s選項,如:...... | tr -s ' '

grep:文本搜尋和匹配

單獨使用,直接指定目標文件

grep能夠單獨使用,直接爲其指定搜索的文件:grep "all:" Makefile
上面是在Makefile中搜索帶字符「all:」的行。grep會打印出全部符合條件的
grep也能夠指定多個文件,如:grep "all:" Makefile Makefile.in
grep能夠指定搜索的目錄。此時grep會遞歸艘運目錄下的全部文件,如:grep "main(" ./ -r能夠在當前目錄下查找main函數。

使用管道

若是grep的非選項參數只有一個,那麼grep會自動從stdin中得到輸入。

只輸出匹配文本

使用-o選項使得grep不是輸出一整行,而只是指定的文本。

使用正則表達式

雖然加上-e選項可讓grep支持正則表達式,但實際上建議直接使用egrep

打印匹配的文件以及在文中的行號

使用選項-n,常常搭配-r來搜索文字。使用-Ax打印匹配目標以後的x行;使用-Bx打印匹配目標以前的 x行;使用-Cx打印先後x行。

多種匹配

使用-e來匹配多個樣式,如:...... | grep -e "Linux" -e "BSD"

忽略模式的大小寫

-i選項

靜默模式

使用-q選項。這個模式下,grep不輸出內容,只在結束的時候給出返回值。匹配成功時,返回0;失敗時,返回非零值。

反匹配

使用-v作反匹配。我常用的一個組合命令就是:
查找我相對於svn上,修改了的文件列表:svn stat | egrep -v "^\?"

打印匹配的文件名

使用-l選項,只打印匹配的文件名。

cut:文本/文件按列劃分

直接上例子吧:cut -f 2,3 table.txt,這個命令表示將文件中全部第二和第三列的內容打印出來。(列數從1開始而不是0)。
  更多的狀況下,咱們是將它接在管道下的,有了cut命令,咱們就能夠很方便地去裁剪。若是沒有文件參數,cut會自動從stdin中獲取文本,正如grep同樣。

指定界定符

若是沒有指定界定符的話,cut使用默認的。通常咱們要使用-d來指定,好比指定斜槓:
cut -f 2,3 -d "/" table.txt

取反

一般cut的模式是「選中」,若是加上--complement選項則變成「清除」

指定列範圍

-f選項有幾種寫法,以下:

  • -f 2:指定第二列
  • -f 2,3,5:指定第2、3、五列
  • -f 2-:指定第二及之後的列
  • -f 2-5:指定第二至五列
  • -f -5:指定第一至五列

對於沒有界定符的行,cut會將哪一行原本來本的輸出。若是想要忽略這樣的行,則使用-s選項

sed:文本替換

sed是stream editor的縮寫。好比最簡單的指定文本替換:sed 's/aaa/bbb' input.txt,將文件input.txt中全部的「aaa」替換成「bbb」。表達式能夠用單引號或者雙引號定義。
  sed在不指定文件名的狀況下,接受stdin做爲輸入源。
  默認狀況下,sed只是將替換的文本輸出,使用-i保存文件,或者是使用重定向來另存爲新的文件。
  默認狀況下,sed只會替換每一行的第一處匹配。絕大多數狀況下咱們須要加上g字符來要求匹配全行全部文本。好比上述命令應該修改成:sed 's/aaa/bbb/g' input.txt。而若是是Ng則表示從第N個匹配開始替換。

定界符

sed使用幾種定界符/, |, :,因此使用這些符號做爲文本字符時,都須要轉義。

刪除

使用格式sed '/......d' file來刪除匹配的格式。刪除空白行的時候能夠這麼寫:
sed '/^\s*$/d' file

替換後內容的指定

匹配內容若是是正則表達式,咱們事先是不知道具體的字符串是什麼的。可是若是要使用匹配到的內容來操做的話,咱們需卻又須要這個字符串。這個時候有兩種方法:
  方法一:使用&來引用匹配到的文本(所以&也是關鍵字)
  方法二:使用正則表達式的「捕獲分組」概念,匹配到的祖父穿的分組能夠在替換字符串中引用,即「\1」、「\2」等方式。
  注意,在sed中的用於分組的括號不能寫做「()」,而是「\(\)

替換級聯

sed的替換操做能夠級聯起來,最直接的方法是使用管道:
sed '...' | sed '...'
第二種方法是在模式中用分號分隔(因此分號也是關鍵字):
sed '...;...'
第三種是使用-e選項:
sed -e '...' -e '...'

將Windows文本轉換爲UNIX文本

sed 's/^M//' filename > newfile
其中的「^M」不是普通字符,須要用Ctrl + V + M打出來。

腳本:對stdout的每一項進行操做

若是咱們使用腳本,怎麼讀取一個命令輸出的信息呢?以下:

for FILE in `find -iname '*.txt' -type f`
do
    ......    # 使用FILE變量操做
while
相關文章
相關標籤/搜索