shell builtin 與部分核心命令不在此列
awk
awk '[<statement>] {<action>} [<statement>] {<action>}...' <filename>:主要用於按記錄(由記錄分隔符決定)處理分段(由字段分隔符決定)文本內容,後者可從標準輸入(默認)或指定文件中讀取
awk後跟隨以''包裹一系列規則,後者以空格或換行符分隔。規則包含可選的 statement 和以{}包裹 action,若 statement 存在則將決定緊隨的 action 是否執行
以下為部分內置變量:
$1、$2、$3...:表示當前記錄中的各個字段$0:表示該記錄自身NF:表示該記錄的字段總數NR:表示該記錄的序號FS:表示當前指定的字段分隔符,默認為空格RS:表示當前指定的記錄分隔符,默認為換行符FILENAME:表示當前處理的文件名,若從標準輸入中讀取則值為-
一些要點:
- 若 action 中包含多個語句,則須以
;分隔 - action 中聲明的自定義變量在所有語句中可用
- action 中可使用 print/printf 將相關內容標準輸出
- statement 中分別以
==和!=表示相等和不等 - statement 和 action 中表示字面量的文本字符須以
""包裹,數字則不用 - 可通過
awk 'BEGIN {FS=<delimeter>} ...'方式修改字段分隔符,等價於指定-F <delimeter>選項。注意BEGIN關鍵字不可省略 - 同理,可通過
awk 'BEGIN {RS=<delimeter>} ...'方式修改記錄分隔符
一些用例:
last -n 5 | awk '{print $1 "\t" $3}'last -n 5 | awk '{print $1 "\t lines:" NR "\t columns:" NF}'awk '{FS=":"} $3<10 {print $1 "\t" $3} /etc/passwd'awk 'BEGIN {FS=":"} $3<10 {print $1 "\t" $3}' /etc/passwd
cat(concatenate)
cat [<file...>]:用於將標準輸入(默認)或指定文件內容標準輸出
-b:顯示行數,空行不編號-n:顯示行數,空行也編號-E:每行末尾處顯示$
cut
cut:將標準輸入按行做字段(列)/字符截取,並標準輸出。用例如下:
-
以
:為分隔點截取列:- 截取第 1 列:
cat /etc/passwd | cut -d ':' -f 1 - 截取第 1、第 3 列:
cat /etc/passwd | cut -d ':' -f 1,3 - 截取第 1-3 列:
cat /etc/passwd | cut -d ':' -f 1-3
- 截取第 1 列:
- 每行截取第 12 字以後內容:
export | cut -c 12-
由於其僅支持單字符分隔符,遇到形如多個空格分隔時建議用 awk 代替
chmod(change mode)
chmod <mod> <file...>:更改文件權限
- 不同權限的數字表示分別為:
r->4,w->2,x->1,-->0 - 可用三者之和表示一類用户的完整權限,如:
rwx->4+2+1->7,r--->4+0+0->4。因而chmod 755 test.sh即表示將 test.sh 的權限設為為rwxr-xr-x
df(Disk Free)
df [<file>...]:輸出指定文件系統的磁盤使用量,默認顯示全部
-h:以可讀單位形式輸出-t <filesystem_type>:只輸出指定類型文件系統-T:額外列出文件系統類型
du(Disk Usage)
du [<file>...]:輸出指定文件(默認當前目錄)的存儲佔用,若為目錄則將遞歸其子目錄
-h:已可讀單位形式輸出-a:遞歸子目錄時顯示所有文件的大小-s:處理目錄時不向下遞歸。如du -s /*輸出根目錄下所有一級子目錄的大小-S:僅輸出非目錄文件的大小
echo
echo <argument...>:將指定字符或變量值標準輸出。默認結尾附加換行符,且不支持反斜槓轉義
-n:結尾不附加換行符-e:支持反斜槓轉義
grep
grep <pattern> [<file>...]:使用正則從標準輸入(默認)或指定文件中找出含匹配字符的行,並標準輸出。常用選項:
-i:忽略大小寫-E:支持擴展正則表達式-e/--regexp=<pattern>:當存在多個 pattern 時須以該選項來指定每一個;或當 pattern 以-開頭時使用,以避免歧義-f <regexp-file>:從指定文件中讀取正則表達式,可存在多個-x:需要整行被匹配-w:需要(兩個詞邊界之間的)整詞被精準匹配,-v:反向選擇-n:輸出時附帶行號-r:遇到目錄時(默認不能搜索目錄)遞歸搜索其下的全部文件內容。軟鏈接默認被忽略,除非其在參數中被顯式指定-R:同-r,但軟鏈接也將被處理-l:僅輸出包含匹配行文件的文件名-h:搜索多文件時不連同相應文件名一起輸出-c:只顯示包含的匹配行數目-B <n>:連同匹配行的前 n 行一起輸出-A <m>:連同匹配行的後 m 行一起輸出
用例如下:
- 連帶匹配行的前 2 行後 3 行一起輸出:
grep 'sys' -B 2 -A 3 /etc/passwd
head
head <file>...:輸出指定文本文件的前 10 行
-n <num>:指定截取行數
ln(link)
ln <source> <target>:為指定文件創建硬鏈接
-s:創建軟鏈接
less
分頁顯示文本內容(man命令即調用其來展示説明文件)。相關操作:
- 空格/Page down:向下翻頁
- Page up:向上翻頁
/:向下搜索?:向上搜索n:跳轉到下一匹配字符所在行N:調轉到上一匹配字符所在行g:跳轉到第一行G:跳轉到末尾行q:退出
nl(number of lines)
nl [<file...>]:將標準輸入(默認)或指定文件附加行號後標準輸出,類似於cat -n
-l <num>:將指定數目的空行計為一行
locate
locate <pattern...>:快速查找文件,其本質為查詢/var/lib/mlocate目錄下的數據庫文件,相比 find 更快但存在滯後性。該數據庫文件會定期更新,也可執行 updatedb 來手動更新
-i:忽略大小寫差異-c:不輸出文件名,僅輸出匹配的文件數量-l <num>:限制輸出條數-r <regexp>:指定正則表達式
printf(print and format)
printf <format> <argument...>:C 語言風格佔位符的格式化輸出。不支持從標準輸入或文件中獲取內容,需要時可與 ` ` 或$()配合使用。以下為部分用例:
<!-- 注意 printf 會以空白符(包括換行符)分隔的字符段填充佔位符,未使用的字符段會被交由下一次 printf,因而需要在[FORMAT]末尾手動添加換行符(\n) -->
-
printf '%s\t %s\t %s\t %s\t %s\t\n' %(cat printf.txt)%s將被依次替換為 printf.txt 中以空白符(含換行符)分隔的字符段\t會讓輸出儘可能列對齊,但不能保證(如當某一字符段特別長時)
-
printf '%10s %5i %5i %5i %8.2f\n' $(cat printf.txt | grep -v Name)%[-]10s表示輸出寬度為 10,-表示左對齊,否則右對齊,不足會以空格符填充%[-]5i表示以整數形式按寬度 5 輸出,其餘同上%[-]8.2f表示以浮點數形式輸出,總寬度為 8,小數點後保留 2 位
%b會使字符段中的轉義生效
sed(stream editor)
sed <expression>:用於過濾和替換文本,後者可從標準輸入(默認)或指定文件中讀取,並將處理後的內容標準輸出。expression 建議用單引號包裹,支持正則表達式。常用選項:
-e <expression>:存在多個 expression 時需要該選項來指定每一個,以避免歧義-n:只輸出新生成的行,包括用於插入、替換或複製後粘貼(p)的-i [<suffix>]:直接修改原文件而非標準輸出,若提供可選後綴則會將原文件以該後綴做備份
用例如下:
- 刪除第 2-5 行:
cat /etc/passwd | sed '2,5d' - 從第 2 行刪除到末尾:
cat /etc/passwd | sed '2,$d' - 在第 2 行後插入一行:
cat /etc/passwd | sed '2a drink tea' - 在第 2 行前插入一行:
cat /etc/passwd | sed '2i drink tea' - 在第 2 行後插入多行:
cat /etc/passwd | sed '2i drink tea\ndrink coffee' - 將第 2-5 行替換為指定內容:
cat /etc/passwd | sed '2,5c No 2-5 line' - 只輸出第 5-7 行:
cat /etc/passwd | sed -n '5,7p' - 刪除所有註釋行(替換為空字符):
cat /etc/man_db_conf | sed 's/#.*$//g' - 刪除所有空行:
cat /etc/man_db.conf | sed 's/#.*$//g' | sed '/^$/d' - 將每行末尾的
.替換為!:cat regular_express.txt | sed 's/\.$/\!/g' - 在文件末尾添加一行:
sed -i '$a #This is a test' regular_express.txt
sort
sort [<file>...]:對標準輸入(默認)或指定文件按行做排序,默認按首字母/數字順序(相同則比較下一個)。常用選項:
-f:忽略大小寫差異-b:忽略開頭的空白符-r:反向排序-c:僅檢查內容是否已按照順序排列-u:排序完成後相同行僅出現一次-k:指定排序時依據的首字符所在列的序號,默認即首列-t <delimeter>:指定列分隔符,默按空白符分列-h:按可讀計量單位為依據排序(如 1K、1G 等)-n:按數值大小進行排序
一些用例:
- 指定
:為分列符,以第 3 列數值大小為依據進行排序:sort -t ':' -k 3 -n /etc/passwd
split
split [<file> [<prefix>]]:對標準輸入(默認)或指定文件內容做分割,默認以 1000 行為基準。分割出的文件位於當前目錄下並以可選的 prefix 為命名前綴
-b <size>:按指定字節大小分割,也可使用 k、m 等單位-l <num>:按指定行數分割
tee
tee <file>:主要用於在命令管道中做分叉重定向,即標準輸入在被轉發至標準輸出的同時,也被重定向至指定文件
-a:指定為追加模式
一些用例:
last | tee ./last | sort
touch
touch <file...>:若文件已存在則更新其 atime/ctime/mtime,否則創建相應空文件
-c/--no-create:不創建任何文件-a:僅更新 atime-m:僅更新 mtime-d | --date=<string>:將變更時間設置為指定時間點,如touch -d "2 days ago" <file...>。注意 ctime 無法被設置,僅能被更新為當前(cp -a同理)
tar
tar <sourcefile...>:用於打包或解包
-c:執行打包-x:執行解包-t:僅列出包中所含文件-f <file>:指定待創建 / 解開 / 檢查的 tar 包(或 tar 壓縮包)-z:打包後用 gzip 進一步壓縮(.tar.gz),或解包(或檢查,下同)前先用 gzip 解壓縮-j:打包後用 bzip2 進一步壓縮(.tar.bz2),或解包前先用 bzip2 解壓縮-J:打包後用 xz 進一步壓縮(.tar.xz),或解包前先用 xz 解壓縮-p:打包時保留文件的原有屬性和權限-P:打包時保留文件的完整路徑(無論在任何目錄下解包,文件都將在原本位置創建)-C <dir>:解包時將內容置於指定目錄下--exclude=<pattern>:解包時跳過匹配文件-v:輸出詳細信息
tail
tail <file>...:輸出指定文本文件的末 10 行
-n <num>:指定截取行數-
-f/--follow[={name|descriptor}]:執行後不退出,每當內容變更時輸出最新內容descriptor:默認值,即使文件被重命名/刪除也繼續監聽name:發生上述情況將做出響應
-F:等價於--follow=name
tr(transform)
tr <set1> [<set2>]:刪除/替換標準輸入中的匹配字符,並標準輸出。set 中可使用通配符
-d:存在於第一個 set 中的字符都將被刪除-s:存在於第一個 set 中的字符都將做相鄰去重
一些用例:
- 大寫轉小寫:
cat /etc/passwd | tr [a-z] [A-Z] - 刪除所有數字:
cat /etc/passwd | tr -d [0-9] - 去除行間空行(即相鄰換行符去重):
car ~/.bashrc | tr -s '\n'
uniq
uniq [<file>]:將標準輸入(默認)或指定文件做相鄰行去重,並標準輸出。非相鄰行建議先用 sort 排序。常用選項:
-i:忽略大小寫差異-c:僅輸出相同行數統計信息
wc(world count)
wc [<file...>]:用於對標準輸入(默認)或指定文件內容做計數統計,依次輸出行/詞/字符統計
-l:僅輸出行統計-w:僅輸出詞統計-m:僅輸出字符統計
which
which <cmd-name>:查找命令文件(不含 shell builtin),本質為根據環境變量PATH中的路徑搜索相應可執行文件名
-a:輸出所有找到的同名文件
xargs(extended arguments)
xargs <command>:將標準輸入內容按分隔符(默認為空白符,含空格、Tab、換行)分段後整體作為參數交給指定 command 執行
-n <num>:指定單次交付的分段數,此時 command 將按批次執行多次-d <delimeter>:指定分隔符,只能為單個字符-E <eof-str>:指定 EOF 行,處理到該行時將 xargs 將結束執行。不可與-d同時使用-0:標準輸入將完全按字面值解析(即反斜槓轉義失效),xargs 將以 null character 為分隔符處理前者,因而標準輸入提供方須提供此類機制(如 find 命令需要附加-print0)。常用於批量刪除文件時文件名中含空白符的情況
一些用例:
- 刪除
/tmp目錄下所有以x x開頭的文件:find /tmp -print0 -name 'x x*' | xargs -0 rm -f