Linux Shell常用技巧(一) RE

一绍绘、特殊文件: /dev/null和/dev/tty

Linux系統(tǒng)提供了兩個對Shell編程非常有用的特殊文件桐智,/dev/null和/dev/tty筐付。其中/dev/null將會丟掉所有寫入它的數(shù)據(jù)幽钢,換句換說,當(dāng)程序?qū)?shù)據(jù)寫入到此文件時逊彭,會認(rèn)為它已經(jīng)成功完成寫入數(shù)據(jù)的操作咸灿,但實際上什么事都沒有做。如果你需要的是命令的退出狀態(tài)侮叮,而非它的輸出避矢,此功能會非常有用,見如下Shell代碼:

 /> vi test_dev_null.sh
#!/bin/bash
if grep hello TestFile > /dev/null
then
    echo "Found"
else
    echo "NOT Found"
fi

在vi中保存并退出后執(zhí)行以下命令:

/> chmod +x test_dev_null.sh  #使該文件成為可執(zhí)行文件
/> cat > TestFile
    hello my friend
    CTRL + D                             #退出命令行文件編輯狀態(tài)
/> ./test_dev_null.sh
    Found                                 #這里并沒有輸出grep命令的執(zhí)行結(jié)果囊榜。

將以上Shell腳本做如下修改:

/> vi test_dev_null.sh
#!/bin/bash
if grep hello TestFile
then
    echo "Found"
else
    echo "NOT Found"
fi

在vi中保存退出后审胸,再次執(zhí)行該腳本:

/> ./test_dev_null.sh
    hello my friend                      #grep命令的執(zhí)行結(jié)果被輸出了。
    Found

下面我們再來看/dev/tty的用途锦聊。當(dāng)程序打開此文件時,Linux會自動將它重定向到一個終端窗口箩绍,因此該文件對于讀取人工輸入時特別有用孔庭。見如下Shell代碼:

/> vi test_dev_tty.sh
#!/bin/bash
printf "Enter new password: "    #提示輸入
stty -echo                               #關(guān)閉自動打印輸入字符的功能
read password < /dev/tty         #讀取密碼
printf "\nEnter again: "             #換行后提示再輸入一次
read password2 < /dev/tty       #再讀取一次以確認(rèn)
printf "\n"                               #換行
stty echo                                #記著打開自動打印輸入字符的功能
echo "Password = " $password #輸出讀入變量
echo "Password2 = " $password2
echo "All Done" 

在vi中保存并退出后執(zhí)行以下命令:

/> chmod +x test_dev_tty.sh #使該文件成為可執(zhí)行文件
/> ./test_dev_tty
    Enter new password:             #這里密碼的輸入被讀入到腳本中的password變量
    Enter again:                          #這里密碼的輸入被讀入到腳本中的password2變量
    Password = hello
    Password2 = hello
    All Done

二、簡單的命令跟蹤:

Linux Shell提供了兩種方式來跟蹤Shell腳本中的命令材蛛,以幫助我們準(zhǔn)確的定位程序中存在的問題圆到。下面的代碼為第一種方式,該方式會將Shell腳本中所有被執(zhí)行的命令打印到終端卑吭,并在命令前加"+":加號的后面還跟著一個空格芽淡。

/> cat > trace_all_command.sh
    who | wc -l                          #這兩條Shell命令將輸出當(dāng)前Linux服務(wù)器登錄的用戶數(shù)量
    CTRL + D                            #退出命令行文件編輯狀態(tài)
/> chmod +x trace_all_command.sh
/> sh -x ./trace_all_command.sh #Shell執(zhí)行器的-x選項將打開腳本的執(zhí)行跟蹤功能。
    + wc -l                               #被跟蹤的兩條Shell命令
    + who
    2                                       #實際輸出結(jié)果豆赏。

Linux Shell提供的另一種方式可以只打印部分被執(zhí)行的Shell命令挣菲,該方法在調(diào)試較為復(fù)雜的腳本時,顯得尤為有用掷邦。

/> cat > trace_patial_command.sh
#! /bin/bash
set -x                #從該命令之后打開跟蹤功能
echo 1st echo                #將被打印輸出的Shell命令
set +x                #該Shell命令也將被打印輸出白胀,然而在該命令被執(zhí)行之后,所有的命令將不再打印輸出
echo 2nd echo                #該Shell命令將不再被打印輸出抚岗。
CTRL + D                #退出命令行文件編輯狀態(tài)
/> chmod +x trace_patial_command.sh
/> ./trace_patial_command.sh
    + echo 1st echo
    1st echo
    + set +x
    2nd echo

三或杠、正則表達(dá)式基本語法描述

Linux Shell環(huán)境下提供了兩種正則表達(dá)式規(guī)則,一個是基本正則表達(dá)式(BRE)宣蔚,另一個是擴(kuò)展正則表達(dá)式(ERE)向抢。
下面是這兩種表達(dá)式的語法列表,需要注意的是胚委,如果沒有明確指出的Meta字符挟鸠,其將可同時用于BRE和ERE,否則將盡適用于指定的模式亩冬。 

| 正則元字符 | 模式含義 |$1 |
|: ------------- |:-----------------| :-----|
|\ |通常用于關(guān)閉其后續(xù)字符的特殊意義兄猩,恢復(fù)其原意。| (...),這里的括號僅僅表示括號枢冤。|
|. |匹配任何單個字符鸠姨。| a.b,將匹配abb淹真、acb等|
|* |匹配它之前的0-n個的單個字符讶迁。| ab,將匹配ab核蘸、aab巍糯、aaab等。|
|^ |匹配緊接著的正則表達(dá)式客扎,在行的起始處祟峦。| ^ab,將匹配abc徙鱼、abd等宅楞,但是不匹配cab。|
|$ |匹配緊接著的正則表達(dá)式袱吆,在行的結(jié)尾處厌衙。| ab$,將匹配ab绞绒、cab等婶希,但是不匹配abc。|
|[...] |方括號表達(dá)式蓬衡,匹配其內(nèi)部任何字符喻杈。其中-表示連續(xù)字符的范圍,^符號置于方括號里第一個字符則有反向的含義狰晚,即匹配不在列表內(nèi)(方括號)的任何字符奕塑。如果想讓]和-表示其原意,需要將其放置在方括號的首字符位置家肯,如[]ab]或[-ab]龄砰,如這兩個字符同時存在,則將]放置在首字符位置讨衣,-放置在最尾部换棚,如[]ab-]。 |[a-bA-Z0-9!]表示所有的大小寫字母反镇,數(shù)字和感嘆號固蚤。[^abc]表示a、b歹茶、c之外的所有字符夕玩。[Tt]om你弦,可以匹配Tom和tom。 |
|{n,m} |區(qū)間表達(dá)式燎孟,匹配在它前面的單個字符重復(fù)出現(xiàn)的次數(shù)區(qū)間禽作,{n}表示重復(fù)n次;{n,}表示至少重復(fù)n次揩页;{n,m}表示重復(fù)n到m次旷偿。 |ab{2}表示abb;ab{2,}表示abb爆侣、abbb等萍程。ab{2,4}表示abb、abbb和abbbb兔仰。 |
|(...) |將圓括號之間的模式存儲在特殊“保留空間”茫负。最多可以將9個獨立的子模式存儲在單個模式中。匹配于子模式的文本乎赴,可以通過轉(zhuǎn)義序列\(zhòng)1到\9忍法,被重復(fù)使用在相同模式里。 |(ab).
\1表示ab組合出現(xiàn)兩次无虚,兩次之間可存在任何數(shù)目的任何字符缔赠,如abcdab衍锚、abab等友题。 |
|{n,m}(ERE) |其功能等同于上面的{n,m},只是不再寫\轉(zhuǎn)義符了戴质。 | ab+匹配ab度宦、abbb等,但是不匹配a告匠。 |
|+(ERE) |和前面的星號相比戈抄,+匹配的是前面正則表達(dá)式的1-n個實例。 | |
|?(ERE) |匹配前面正則表達(dá)式的0個或1個后专。 |ab?僅匹配a或ab划鸽。 |
||(ERE) |匹配于|符號前后的正則表達(dá)式。 | (ab|cd)匹配ab或cd戚哎。 |
|[:alpha:] |匹配字母字符裸诽。 | [[:alpha:]!]ab$匹配cab、dab和!ab型凳。 |
|[:alnum:] |匹配字母和數(shù)字字符丈冬。 | [[:alnum:]]ab$匹配1ab、aab甘畅。 |
|[:blank:] |匹配空格(space)和Tab字符埂蕊。 | [[:alnum:]]ab$匹配1ab往弓、aab。 |
|[:cntrl:] |匹配控制字符蓄氧。 | |
|[:digit:] |匹配數(shù)字字符函似。 | |
|[:graph:] |匹配非空格字符。 | |
|[:lower:] |匹配小寫字母字符匀们。 | |
|[:upper:] |匹配大寫字母字符缴淋。 | |
|[:punct:] |匹配標(biāo)點字符。 | |
|[:space:] |匹配空白(whitespace)字符泄朴。 | |
|[:xdigit:] |匹配十六進(jìn)制數(shù)字重抖。 | |
|\w |匹配任何字母和數(shù)字組成的字符,等同于[[:alnum:]] | |
|\W |匹配任何非字母和數(shù)字組成的字符祖灰,等同于[^[:alnum:]
] | |
|<> | 匹配單詞的起始和結(jié)尾钟沛。 | <read匹配readme,me>匹配readme局扶。 |

下面的列表給出了Linux Shell中常用的工具或命令分別支持的正則表達(dá)式的類型恨统。

grep sed vi egrep awk
BRE * * *
ERE * *

四、使用cut命令選定字段:

cut命令是用來剪下文本文件里的數(shù)據(jù)三妈,文本文件可以是字段類型或是字符類型畜埋。下面給出應(yīng)用實例:

/> cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
/> cut -d : -f 1,5 /etc/passwd     #-d后面的冒號表示字段之間的分隔符,-f表示取分割后的哪些字段
    root:root                                 #這里取出的是第一個和第五個字段畴蒲。
    bin:bin
    daemon:daemon
    adm:adm
/> cut -d: -f 3- /etc/passwd       #從第三個字段開始顯示悠鞍,直到最后一個字段。
    0:0:root:/root:/bin/bash
    1:1:bin:/bin:/sbin/nologin
    2:2:daemon:/sbin:/sbin/nologin
    3:4:adm:/var/adm:/sbin/nologin
    4:7:lp:/var/spool/lpd:/sbin/nologin

這里需要進(jìn)一步說明的是模燥,使用cut命令還可以剪切以字符數(shù)量為標(biāo)量的部分字符咖祭,該功能通過-c選項實現(xiàn),其不能與-d選項共存蔫骂。

/> cut -c 1-4 /etc/passwd          #取每行的前1-4個字符么翰。
/> cut -c-4 /etc/passwd            #取每行的前4個字符。 
    root
    bin:
    daem
    adm:
/> cut -c4- /etc/passwd            #取每行的第4個到最后字符辽旋。
    t:x:0:0:root:/root:/bin/bash
    :x:1:1:bin:/bin:/sbin/nologin
    mon:x:2:2:daemon:/sbin:/sbin/nologin
    :x:3:4:adm:/var/adm:/sbin/nologin

/> cut -c1,4 /etc/passwd           #取每行的第一個和第四個字符浩嫌。
    rt
    b:
    dm
    a:

/> cut -c1-4,5 /etc/passwd        #取每行的1-4和第5個字符。
    root:
    bin:x
    daemo
    adm:x

五补胚、計算行數(shù)码耐、字?jǐn)?shù)以及字符數(shù):

Linux提供了一個簡單的工具wc用于完成該功能,見如下用例:

/> echo This is a test of the emergency broadcast system | wc
    1    9    49                              #1行糖儡,9個單詞伐坏,49個字符
/> echo Testing one two three | wc -c
    22                                         #22個字符
/> echo Testing one two three | wc -l
    1                                           #1行
/> echo Testing one two three | wc -w
    4                                           #4個單詞
/> wc /etc/passwd /etc/group    #計算兩個文件里的數(shù)據(jù)。
    39   71  1933  /etc/passwd
    62   62  906    /etc/group
    101 133 2839  總用量

六. 提取開頭或結(jié)尾數(shù)行:

有時握联,你會需要從文本文件里把幾行字桦沉,多半是靠近開頭或結(jié)尾的幾行提取出來每瞒。如查看工作日志等操作。Linux Shell提供head和tail兩個命令來完成此項工作纯露。見如下用例:

/> head -n 5 /etc/passwd      #顯示輸入文件的前五行剿骨。
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

/> tail -n 5 /etc/passwd      #顯示輸入文件的最后五行。
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
    pulse:x:496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    stephen:x:500:500:stephen:/home/stephen:/bin/bash

如果使用者想查看不間斷增長的日志(如服務(wù)程序輸出的)埠褪,可以使用tail的-f選項浓利,這樣可以讓tail命令不會自動退出,必須通過CTRL+C命令強(qiáng)制退出钞速,因此該選項不適合用于Shell腳本中贷掖,見如下用例:

/> tail -f -n 5 my_server_log

轉(zhuǎn)自:http://www.cnblogs.com/mchina/archive/2012/06/29/2570018.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渴语,隨后出現(xiàn)的幾起案子苹威,更是在濱河造成了極大的恐慌,老刑警劉巖驾凶,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牙甫,死亡現(xiàn)場離奇詭異,居然都是意外死亡调违,警方通過查閱死者的電腦和手機(jī)窟哺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來技肩,“玉大人且轨,你說我怎么就攤上這事∧豆恚” “怎么了殖告?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵阿蝶,是天一觀的道長雳锋。 經(jīng)常有香客問我,道長羡洁,這世上最難降的妖魔是什么玷过? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮筑煮,結(jié)果婚禮上辛蚊,老公的妹妹穿的比我還像新娘。我一直安慰自己真仲,他們只是感情好袋马,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秸应,像睡著了一般虑凛。 火紅的嫁衣襯著肌膚如雪碑宴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天桑谍,我揣著相機(jī)與錄音延柠,去河邊找鬼。 笑死锣披,一個胖子當(dāng)著我的面吹牛贞间,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雹仿,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼增热,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胧辽?” 一聲冷哼從身側(cè)響起钓葫,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎票顾,沒想到半個月后础浮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡奠骄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年豆同,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片含鳞。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡影锈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝉绷,到底是詐尸還是另有隱情鸭廷,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布熔吗,位于F島的核電站辆床,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏桅狠。R本人自食惡果不足惜讼载,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望中跌。 院中可真熱鬧咨堤,春花似錦、人聲如沸漩符。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗜暴。三九已至凸克,卻和暖如春铝侵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背触徐。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工咪鲜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撞鹉。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓疟丙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸟雏。 傳聞我的和親對象是個殘疾皇子享郊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容