Linux特殊字元淺談 我們經常跟鍵盤上面那些特殊符號比如(?、!、~...)打交道,其實在Linux有其獨特的含義,大致可以分為三類:Linux特殊符號、通配符、正則表達式。 Linux特殊符號又可以分以下幾類 1、管道符號 字元 名稱 功能描述 | 管道 傳遞的普通的字元串,來自於前一個命令 | ...
Linux特殊字元淺談
我們經常跟鍵盤上面那些特殊符號比如(?、!、~...)打交道,其實在Linux有其獨特的含義,大致可以分為三類:Linux特殊符號、通配符、正則表達式。
Linux特殊符號又可以分以下幾類
1、管道符號
字元 |
名稱 |
功能描述 |
| |
管道 |
傳遞的普通的字元串,來自於前一個命令 |
|xargs |
管道流轉換 |
與xargs 傳遞的是把字元串變成了文件名 |
2、目錄結構
字元 |
名稱 |
功能描述 |
. |
|
當前目錄 |
.. |
|
當前目錄上一級目錄 |
3、重定向符號
字元 |
名稱 |
功能描述 |
> |
輸出重定向 |
會清空原文以及內容 然後在向文件裡面追加內容 |
>> |
追加輸出重定向 |
追加到文件最後一行 |
< |
輸入重定向 |
文本內容輸入 tr xargs |
<< |
追加輸入重定向 |
用於給文件追加多行文本 cat |
4、其他特殊符號
字元 |
名稱 |
功能描述 |
# |
註釋 |
Linux註釋,另#root 超級用戶提示符 |
$ |
變數符號 |
shell、$變數取值、AWK取列等 |
&& |
表示並且 |
前面部分執行成功才執行後面的部分 |
|| |
表示或者 |
前面部分執行失敗才執行後面的部分 |
`` |
Shell執行命令 |
引用命令的結果 |
; |
命令分割 |
一行分割多個命令,沒有邏輯聯繫 |
‘’ |
設置字元串變數 |
不具有變數置換功能,輸出時所見即所得 |
“” |
設置字元串變數 |
具有變數置換功能,解析變數輸出 |
{} |
表示序列 |
以逗號分割,且不能為空,如{a,b,c}表示單獨 {0..9}表示範圍,同功能的有seq,但seq只產生數字序列 |
- |
|
cd - su - root |
~ |
|
當前目錄的家目錄 |
/ |
|
根或者路徑分割 |
! |
|
vi/vim強制退出 邏輯運算非, !+字母 調出最近一次以字母開頭的命令 !!使用 最近一次操作的命令 !+數字 調出歷史的第幾條命令 |
通配符:通常匹配文件名
字元 |
名稱 |
功能描述 |
? |
|
匹配任一個字元(不在括弧內的時候) |
* |
|
匹配任何字元(0或多個) |
[] |
|
匹配符號內任一字元 如[abcd] [0-9] |
[!]非 |
|
表示不匹配[]裡面任一字元 |
正則表達式:處理大量的字元串,通常以行為單位(簡單高效)
基礎正則BRE
字元 |
名稱 |
功能描述 |
^ |
|
以某某開頭的 |
$ |
|
以某某結尾的 |
^$ |
|
空行,不是空格 |
. |
|
表示任意一個字元 |
\ |
元字元轉義普通字元 |
\. 普通字元小數點 \n 換行符 \b 單詞邊界 \r 回車 \t 橫向製表符 |
* |
|
重覆之前的字元0個或者多個 |
.* |
|
匹配所有字元 |
^.* |
|
以任意多個字元開頭 |
.*$ |
|
以任意多個字元結尾 |
[] |
|
匹配字元串內的任意一個字元,如[abc]匹配a或b或c,[a-z]匹配所有小寫字母 |
[^] |
|
匹配不包含字元串內的任意字元,取反 |
擴展正則ERE(使用egrep或者sed -r)
字元 |
名稱 |
功能描述 |
+ |
|
重覆前一個字元一次或一次以上,如[0-9]+ |
? |
|
重覆前一個字元0次或者一次 |
| |
|
元字元左邊字元或者右邊字元 |
() |
|
分組過濾,如()內的內容為一個整體;反向引用:如\1表示引用第一個()裡面的內容 |
a{n,m} |
|
重覆前面a字元n到m次,egrep或者sed -r直接使用,如grep,sed使用該功能需要轉義a\{n,m\} |
a{n,} |
|
重覆前面a字元至少n次 |
a{n} |
|
重覆前面a字元n次 |
a{,m} |
|
重覆前面a字元最多m次 |
學習正則表達,我們可以使用Linux運維三劍客:awk、sed、grep;除了前三者,正則表達式還支持各種編程或者腳本語言
為了更好的學習和工作,我們一般自動添加顏色來區分匹配關鍵字
cat >> /etc/bashrc << EOF
alias egrep='egrep --color=auto'
alias grep='grep --color=auto'
EOF
source /etc/bashrc
學習步驟:
1:grep /RE/ filename
2:grep -o /RE/ filename 看它如何匹配
區分正則表達式和通配符
表達式是文件或者目錄名 -->通配符
表達式是文件內容(字元串) -->正則表達式
學習正則方法:awk、sed -r、grep/egrep -o:該都是匹配正則,其他都是通配符
幫助文檔:通配符man 7 glob
正則表達式:man grep、info grep等等
舉例:
1、/etc/hosts 取該文件許可權對應的數字內容 如:-rw-r--r--對應的為644
思路方法:sed 正則、awk 分割符、grep、cut、ls 替換、stat、head
stat /etc/hosts | sed -n '4p' | sed 's#^.*(0##g' | sed 's#/.*$##g'
stat /etc/hosts | sed -rn '4s#^.*\(0(.*)/-.*$#\1#gp'
stat /etc/hosts | awk 'NR==4' | awk -F "0" '{print $2}' | cut -c 1-3
stat /etc/hosts | awk 'NR==4' | awk -F "0" '{print $2}' | awk -F "/" '{print $1}'
stat /etc/hosts | awk 'NR==4' | awk -F "[0/]" '{print $2}'
stat /etc/hosts | awk 'NR==4' | awk -F "0|/" '{print $2}'
stat /etc/hosts | awk -F "[0/]" 'NR==4{print $2}'
ls -l /etc/hosts | cut -c 2-10 | tr "rwx-" "4210" | awk -F "" '{print $1+$2+$3 $4+$5+$6 $7+$8+$9}'
ls -l /etc/hosts | cut -c 2-10 | tr "rwx-" "4210" | awk -F "" '{for(i=1;i<=NF;i++){if(i<4){user[a]+=$i}else if(i>3&&i<7){group[b]+=$i}else{other[c]+=$i}};print user[a]group[b]other[c]}'
ls -l /etc/hosts | awk -F "" '{gsub("r","4")};{gsub("w","2")};{gsub("x","1")};{gsub("-","0");print $2+$3+$4 $5+$6+$7 $8+$9+$10}'
2、取IP地址
ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'
ifconfig eth0 | awk -F "addr:| Bcast:" 'NR==2{print $2}'