shell的輸入與輸出主要包括:
echo命令
read命令
cat命令
管道
tee命令
標準輸入、輸出和標準錯誤
重新導向
echo [-e] [-n] string
string : 字串,可以含 shell 變數、轉義符等, 一般用雙引號括起來
-e : 讓 echo 解釋 string 中的轉義符
-n : 禁止 echo 輸出後輸出 NEWLINE(換行)
cat [-n][-b][-t][-e] file1 file2 ...
cat 是一個簡單而通用的命令,可以用它來顯示檔案內容,建立檔案,還可以用它來顯示控制字元
-n : 顯示行號
-b : 顯示行號(不含空行)
-t : 顯示定位字元
-e : 顯示行結束符
建立檔案:
cat file1 file2 > newfile 合并檔案
cat > newfile 輸入文本,按 ctrl+d 結束輸入
管道
| : 把一個命令的輸出傳遞給另一個命令作為輸入。
例:ls –l | grep ^d
tee 命令
把輸出的一個副本輸送到標準輸出,另一個副本拷貝到相應的檔案中。
tee [-a] filename
-a : 追加到檔案末尾
tee 命令一般與管道結合使用
例:ls | tee list.out
grep:
不會對輸入檔案進行任何修改或影響
grep家族:grep,egrep,fgrep
形式:
grep [選項] pattern file1 file2 ...
pattern:可以是Regex(用單引號括起來)、 或字串(加雙引號)、或一個單詞。
file1 file2 ... :檔案名稱列表,作為 grep 命令的輸入;grep 的輸入也可以來自標準輸入或管道;
可以把匹配模式寫入到一個檔案中,每行寫一個,然後使用 -f 選項,將該匹配模式傳遞給 grep 命令。
grep -f patternfile file1 file2 ...
常用選項:
-c 只輸出匹配的行的總數
-i 不區分大小寫
-h 查詢多個檔案時,不顯示檔案名稱
-l 查詢多個檔案時,只輸出包含匹配模式的檔案的檔案名稱
-n 顯示匹配的行及行號
-v 反向尋找,即只顯示不包含匹配模式的行
-s 不顯示錯誤資訊
例:
1.查詢多個檔案,可以使用萬用字元 “ * ”
如:grep "math2" *.txt
grep "12" *
2.反向匹配
ps aux | grep "ssh" | grep –v "grep"
3.匹配空行
grep -n '^$' datafile
grep -v '^$' datafile > datafile2
4.精確匹配單詞: /< 和 />
找出所有包含 以 north 開頭 的單詞的行
grep '/<north' datafile
找出所有包含 以 west 結尾 的單詞的行
grep 'west/>' datafile
找出所有包含 north 單詞的行
grep '/<north/>' datafile
5.遞迴搜尋目錄中的所有檔案:-r
grep -r "north" datafile ~/Teaching/linux/
6.關於某個字元連續出現次數的匹配
grep 'o/{2,/}' helloworld
'o/{2,4/}' , 'o/{2,4/}' , 'lo/{2,4/}'
流編輯器sed
sed 是一個精簡的、非互動編輯器,它在命令列中輸入編輯命令和指定檔案名稱,然後在螢幕上查看輸出。
sed如何工作的:
sed 逐行處理檔案(或輸入),並將輸出結果發送到螢幕。
即:sed 從輸入(可以是檔案或其它標準輸入)中讀取一行,將之拷貝到一個編輯緩衝區,按指定的 sed 編輯命令進行處理,編輯完後將其發送到螢幕上,然後把這行從編輯緩衝區中刪除,讀取下面一行。重複此過程直到全部處理結束。
sed 只是對檔案在記憶體中的副本進行操作,所以 sed 不會修改輸入檔案的內容。sed 總是輸出到標準輸出,可以使用重新導向將 sed 的輸出儲存到檔案中。
三種調用方式:
1.在命令列中直接調用
2.將sed命令插入指令檔,然後調用
3.將sed命令插入到指令檔,產生sed可執行指令碼,在命令列中直接鍵入指令碼名
常見的 sed 編輯命令小結:
p 列印匹配行 s 替換命令
= 顯示匹配行的行號 l 顯示指定行中所有字元
d 刪除匹配的行 r 讀檔案
a/ 在指定行後面追加文本 w 寫檔案
i/ 在指定行前面追加文本 n 讀取指定行的下面一行
c/ 用新文本替換指定的行 q 退出 sed
在 sed_cmd 中可以使用 shell 變數,此時應使用 雙引號。
一些 sed 行命令集:
'/north/p' 列印所有包含 north 的行
'/north/!p' 列印所有不包含 north 的行
's//.$//g' 刪除以句點結尾的行中末尾的句點
's/^ *//g' 刪除行首空格(命令中 ^ * 之間有兩個空格)
's/ */ /g' 將連續多個空格替換為一個空格
命令中 */ 前有三個空格,後面是一個空格
'/^$/d’ 刪除空行
's/^.//g' 刪除每行的第一個字元,同 's/.//'
's/^/%/g' 在每行的最前面添加百分比符號 %
'3,5s/d/D/' 把第 3 行到第 5 行中每行的 第一個 d 改成 D
awk:
awk 是一種用於處理資料和產生報告的程式設計語言
awk 可以在命令列中進行一些簡單的操作,也可以被寫成指令碼來處理較大的應用問題
awk 與 grep、sed 結合使用,將使 shell 編程更加容易
awk如何工作的:
awk 漸進式掃描輸入 ( 可以是檔案或管道等 ),按給定的模式尋找出匹配的行,然後對這些行執行 awk 命令指定的操作
也有類似的三種使用方式。
awk的執行過程:
① 如果存在 BEGIN ,awk 首先執行它指定的 actions
② awk 從輸入中讀取一行,稱為一條輸入記錄
③ awk 將讀入的記錄分割成數個欄位,並將第一個欄位放入變數 $1 中,第二個放入變數 $2 中,以此類推;$0 表示整條記錄; 欄位分隔符號可以通過選項 -F 指定,否則使用預設的分隔字元。
④ 把當前輸入記錄依次與每一個 awk_cmd 中 pattern 比較: 如果相匹配,就執行對應的 actions; 如果不匹配,就跳過對應的 actions,直到完成所有的 awk_cmd
⑤ 當一條輸入記錄處理完畢後,awk 讀取輸入的下一行,重複上 面的處理過程,直到所有輸入全部處理完畢。
⑥ awk 處理完所有的輸入後,若存在 END,執行相應的 actions
⑦ 如果輸入是檔案清單,awk 將按順序處理列表中的每個檔案。
awk 中Regex中常用到的元字元有:
^ 只匹配行首 ( 可以看成是行首的標誌 )
$ 只匹配行尾 ( 可以看成是行尾的標誌 )
* 一個單字元後緊跟 *,匹配 0個或多個此字元
[ ] 匹配 [] 內的任意一個字元 ( [^] 反向匹配 )
/ 用來屏蔽一個元字元的特殊含義
. 匹配任意單個字元
str1|str2 匹配 str1 或 str2
+ 匹配一個或多個前一字元
? 匹配零個或一個前一字元
( ) 字元組
Linux 下使用的 awk 是 gawk
操作由一條或多條語句或者命令組成,語句、命令之間用分號 “ ; ” 隔開。操作中還可以使用流程式控制制結構的語句
awk 命令:
print 輸出資料行表:列印字串、變數或運算式,輸出資料行表中各參數之間用逗號隔開;若用空格隔開,列印時各輸出之間沒有空格
printf ( [格式控制符], 輸出資料行表 ) :格式化列印,文法與 C語言中的 printf 函數類似
next:停止處理目前記錄, 開始讀取和處理下一條記錄
nextfile:強迫 awk 停止處理當前的輸入檔案而處理輸入檔案清單中的下一個檔案
exit:使 awk 停止執行而跳出。若存在 END 語句,則執行 END 指定的 actions
為了避免碰到 awk 錯誤,要注意以下事項:
確保整個 awk_script 用單引號括起來
確保 awk_script 內所有引號都成對出現
確保用花括弧括起動作語句,用圓括弧括起條件陳述式
如果使用字串,要保證字串被雙引號括起來 ( 在模式中除外 )
awk 語言學起來可能有些複雜,但使用它來編寫一行命令或小指令碼並不太難。awk 是 shell 編程的一個重要工具。在shell 命令或編程中,可以使用 awk 強大的文本處理能力