《前端運維》一、Linux基礎--08Shell其他及補充
這一篇,我們來學習一些重要的命令,在工作中也會經常用到。
一、簡單正則
要注意的是,有些命令不支援正則模式,比如fs、find等,有些是支援正則的,比如grep、awk、sed等。正則的語法和js中的正則幾乎沒有區別,下面僅簡單羅列下常用的正則:
元字元 | 作用 | 示例 |
---|---|---|
* | 前一個字元匹配 0 次或任意多次 | grep 1* reg.txt |
. | 匹配除換行符外的任意一個字元 | grep . reg.txt |
^ | 匹配行首。例如,^hello 會匹配以 hello 開頭的行 | grep ^a reg.txt |
$ | 匹配行尾。例如,hello& 會匹配以 hello 結尾的行 | grep a$ reg.txt |
[] | 匹配中括號中指定的任意一個字元,而且只匹配一個字元。 例如.[aoeiu]匹配任意一個母音字母, [0-9] 匹配任意一位數字, [a-z][0-9] 匹配由小寫字母和一位數字構成的兩位字元 |
grep ab[bc]c reg.txt |
[^] | 匹配除中括號中的字元以外的任意一個字元。例如,[^0-9] 匹配任意一位非數字字元, [^a-z] 匹配任意一位非小寫字母 |
grep a[^fg]c reg.txt |
\ | 轉義符,用於取消特殊符號的含義 | grep \.$ reg.txt |
{n} | 表示其前面的字元恰好出現 n 次。例如,[0-9]{4} 匹配4位數字,[1][3-8][0-9]{9} 匹配手機號碼 | grep "a{1}" reg.txt |
(n,} | 表示其前面的字元出現不少於 n 次。例如,[0-9]{2,} 匹配兩位及以上的數字 | grep "a{1,}" reg.txt |
{n,m} | 表示其前面的字元至少出現 n 次,最多出現 m 次。例如,[a-z]{6,8} 匹配 6〜8 位的小寫字母 | grep "a{2,3}" reg.txt |
例子已經寫在表格裡了,大家可以自己去試一下。這裡不多說。
二、cut命令
用來提取文字中的某一部分。
選項有:
- -b,以位元組為單位進行分割。這些位元組位置將忽略多位元組字元邊界,除非也指定了 -n 標誌。
- -c,以字元為單位進行分割。
- -f,與-d一起使用,指定顯示哪個區域。
- -d,自定義分隔符,預設為製表符。
如果不指定 File 引數,cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標誌之一。
cut最常用的就是-d和-f的配合使用:
或者:
然後,cut的作用可遠不止如此,還有一些其他的用法。要注意靈活運用。
三、printf命令
printf 由 POSIX 標準所定義,因此使用 printf 的指令碼比使用 echo 移植性好。printf 使用引用文字或空格分隔的引數,外面可以在 printf 中使用格式化字串,還可以制定字串的寬度、左右對齊方式等。預設 printf 不會像 echo 自動新增換行符,我們可以手動新增 \n。
printf的語法是這樣的:
-
printf format-string [arguments...],
- format-string: 為格式控制字串
- arguments: 為引數列表。
我們先來看個例子:
#!/bin/bash printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
結果是:
1、%s %c %d %f 都是格式替代符,%s 輸出一個字串,%d 整型輸出,%c 輸出一個字元,%f 輸出實數,以小數形式輸出。
2、%-10s 指一個寬度為 10 個字元(- 表示左對齊,沒有則表示右對齊),任何字元都會被顯示在 10 個字元寬的字元內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。
3、%-4.2f 指格式化為小數,其中 .2 指保留2位小數。
我們再來看個例子:
#!/bin/bash # format-string為雙引號 printf "%d %s\n" 1 "abc" # 單引號與雙引號效果一樣 printf '%d %s\n' 1 "abc" # 沒有引號也可以輸出 printf %s abcdef # 格式只指定了一個引數,但多出的引數仍然會按照該格式輸出,format-string 被重用 printf %s abc def printf "%s\n" abc def printf "%s %s %s\n" a b c d e f g h i j # 如果沒有 arguments,那麼 %s 用NULL代替,%d 用 0 代替 printf "%s and %d \n"
結果如下:
另外,printf的轉義序列如下:
序列 | 說明 |
---|---|
\a | 警告字元,通常為ASCII的BEL字元 |
\b | 後退 |
\c | 抑制(不顯示)輸出結果中任何結尾的換行字元(只在%b格式指示符控制下的引數字串中有效),而且,任何留在引數裡的字元、任何接下來的引數以及任何留在格式字串中的字元,都被忽略 |
\f | 換頁(formfeed) |
\n | 換行 |
\r | 回車(Carriage return) |
\t | 水平製表符 |
\v | 垂直製表符 |
\\ | 一個字面上的反斜槓字元 |
\ddd | 表示1到3位數八進位制值的字元。僅在格式字串中有效 |
\0ddd | 表示1到3位的八進位制值字元 |
四、awk命令
AWK 是一種處理文字檔案的語言,是一個強大的文字分析工具。之所以叫 AWK 是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字元。
https://www.runoob.com/linux/linux-comm-awk.html
五、sed命令
sed 命令是利用指令碼來處理文字檔案。sed 可依照指令碼的指令來處理、編輯文字檔案。sed 主要用來自動編輯一個或多個檔案、簡化對檔案的反覆操作、編寫轉換程式等。
https://www.runoob.com/linux/linux-comm-sed.html
六、sort命令
sort命令用於將文字檔案內容加以排序。sort可針對文字檔案的內容,以行為單位來排序。
語法是這樣的:
-
sort [-bcdfimMnr][-o<輸出檔案>][-t<分隔字元>][+<起始欄位>-<結束欄位>][--help][--verison][檔案]
- -b 忽略每行前面開始出的空格字元。
- -c 檢查檔案是否已經按照順序排序。
- -d 排序時,處理英文字母、數字及空格字元外,忽略其他的字元。
- -f 排序時,將小寫字母視為大寫字母。
- -i 排序時,除了040至176之間的ASCII字元外,忽略其他的字元。
- -m 將幾個排序好的檔案進行合併。
- -M 將前面3個字母依照月份的縮寫進行排序。
- -n 依照數值的大小排序。
- -u 意味著是唯一的(unique),輸出的結果是去完重了的。
- -o<輸出檔案> 將排序後的結果存入指定的檔案。
- -r 以相反的順序來排序。
- -t<分隔字元> 指定排序時所用的欄位分隔字元。
- +<起始欄位>-<結束欄位> 以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。
- --help 顯示幫助。
- --version 顯示版本資訊。
七、wc命令
wc命令用於計算字數。利用wc指令我們可以計算檔案的Byte數、字數、或是列數,若不指定檔名稱、或是所給予的檔名為"-",則wc指令會從標準輸入裝置讀取資料。
語法如下:
-
wc [-clw][--help][--version][檔案...]
- -c或--bytes或--chars 只顯示Bytes數。
- -l或--lines 顯示行數。
- -w或--words 只顯示字。
- --help 線上幫助。
- --version 顯示版本資訊。
這個命令比較簡單,大家可以自己嘗試下。