1 前言
在上篇文章 BASH 學習——變量中我們介紹了 BASH 的變量。本篇文章介紹如何在執行 bash 命令後得到的結果中獲取我們想要的數據。
2 通配符
*
:表示 0 到無窮多個任意字符;
?
:表示有且有一個任意字符;
[]
:表示至少有一箇中括號裏的字符;
[n-m]
:表示 n 到 m 的連續字符,比如 [0-9]
表示 0 到 9 的數字;
[^]
:表示有一定有一個字符並且不是中括號裏的字符,比如 [^abc]
表示一定有一個字符並且不是 a、b、c。
3 數據流重導向
數據流重導向就是把原來要輸出到屏幕的命令的執行結果輸出到其他地方,比如,文件或者打印機。
3.1 標準輸出和標準錯誤輸出
標準輸出是命令正常執行後輸出的正確信息;標準錯誤輸出是命令執行失敗後輸出的錯誤信息。我們使用標準輸出和標準錯誤輸出可以實現將命令執行的正確結果和錯誤結果分別存在不同的文檔中,避免都亂哄哄的顯示在屏幕上。標準輸出和標準錯誤輸出在命令中的表示如下:
標準輸出:代碼爲 1,使用
>
或者>>
;標準錯誤輸出:代碼爲 2,使用
2>
或者2>>
。
注意:
>
和>>
以及2>
和2>>
的區別在於>
或者2>
後跟文件名的時候,如果該文件不存在則新建,如果存在則先清空該文件然後寫入結果。而>>
和2>>
則是,如果後跟的文件不存在則新建,如果存在則在該文件的後面累加寫如結果。
例如,系統中有文檔 test.txt。使用命令 cat test.txt > stdout
。執行結果不在是將 test.txt 的內容顯示在屏幕上而是存入文檔 stdout 中。如果 stdout 不存在則先新建 stdout 然後將 test.txt 內容寫入。如果 stdout 已經存在,則先將 stdout 的內容清空,然後寫入 test.txt 的內容。如果不想要 stdout 內容被清空將 test.txt 的內容追加到 stdout 原有內容的後面則可以使用命令 cat test.txt >> stdout
。
3.2 標準輸入
標準輸入在命令中的表示如下:
- 標準輸入:代碼爲 0 ,使用
<
或者<<
標準輸入 <
就是用文檔的內容代替原來由鍵盤輸入的內容。<<
代表結束的輸入字符。比如 >> "eof"
表示當碰到 eof
時結束輸入。
3.3 管線命令
管線命令就是將上一個命令的執行正確結果當作下一個命令的輸入。使用 |
表示。例如,ls -al /etc | less
,就是把 ls 執行的結果使用 less 顯示。
注意:管線命令
|
只能處理上一個命令執行的正確的結果,也就是標準輸出,|
後面的接的第一個數據必須是能夠接受標準輸入的命令。
3.3.1 grep
grep 支持管線命令,我們可以用它篩選執行結果中我們想要的數據,命令格式如下:grep [-acinv] [--color=auto] '搜尋字符' finename
。
各個參數的含義如下:
-a
: 將二進制文檔以字符文檔的方式搜尋;-c
: 統計找到搜尋字符的次數;-i
: 忽略大小寫;-n
: 輸出行號;-v
:反向選擇,即輸出沒有搜尋字符的行;--color=auto
:將找到的搜尋字符加上顏色顯示
例如,我們想要輸出家目錄下和 root 有關的文檔,即該文檔的擁有者,羣組只要有一個是 root 則輸出該文檔的所在行。命令如下:
ls -al ~ | grep 'root'