本文列明Linux的經常使用命令用法,學會了這些命令以後,結合shell編程知識,就能夠作各類自動編譯/集成的工做啦。
本文地址:http://www.javashuo.com/article/p-bkarbrbm-dm.htmlhtml
《Linux Shell 腳本攻略》
Linux中怎麼找出空文件夾?git
cat file1 file2 file3 ...
除了常有的用來顯示文件內容以外,cat
有兩個妙用:正則表達式
xxxx | cat - output.txt
本例中使用「-
」表示stdin,用xxxx命令的輸出重定向給cat
shell
cat file1 | file2 > output.txt
將兩個文本合併編程
cat -s input.txt
cat -n input.txt
基本用法: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
:socketp
:pipe參數都是如下格式:-選項 天數
,天數表示距離今天幾天內。選項以下:
-atime
:access time-mtime
:modification time-ctime
:change time(注:這個和mtime有啥區別?)好比搜索7天內訪問過的全部文件:find . -type f -atime -7
或者是訪問超過7天的文件:find . -type f -atime +7
也能夠是剛好7天:find . -type f -atime 7
上述參數是以天爲單位的。下面幾個參數以分鐘爲單位:-amin
, -mmin
, -cmim
-size 參數
後面的參數能夠用多種單位,好比c
(char,字節)、k
、M
、G
。好比查找大於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不支持空文件夾啊……因此我得找到全部的空文件夾再作特殊處理。
有些命令能夠支持stdin重定向做爲輸入,這是極好的。可是大部分不行。這個時候就須要使用xargs
了。。
這個命令的做用就是將stdout的內容,做爲其餘命令的參數進行調用。基本格式是:
command | xargs ...
最簡單的應用是將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命令的分隔符除了多是'\n
以外,也多是' '
(空格)。爲了防止錯誤,find應該使用-print0
選項,而xargs使用-0
(槓零) 選項。好比:find -name ".svn" -print0 | xargs -0 rm -rf
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 "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 -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
:指定第二至五列-5
:指定第一至五列對於沒有界定符的行,cut會將哪一行原本來本的輸出。若是想要忽略這樣的行,則使用-s
選項
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 '...'
sed 's/^M//' filename > newfile
其中的「^M
」不是普通字符,須要用Ctrl + V + M
打出來。
若是咱們使用腳本,怎麼讀取一個命令輸出的信息呢?以下:
for FILE in `find -iname '*.txt' -type f` do ...... # 使用FILE變量操做 while