博客 / 詳情

返回

linux 常用命令

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
  • 每行截取第 12 字以後內容:export | cut -c 12-

由於其僅支持單字符分隔符,遇到形如多個空格分隔時建議用 awk 代替

chmod(change mode)

chmod <mod> <file...>:更改文件權限

  • 不同權限的數字表示分別為:r->4w->2x->1-->0
  • 可用三者之和表示一類用户的完整權限,如:rwx->4+2+1->7r--->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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.