Linux Shell常用技巧(一)
Linux Shell常用技巧 文章轉(zhuǎn)載自:http://www.cnblogs.com/stephen-liu74/archive/2011/12/20/2285454.html
一.?? ?特殊文件: /dev/null和/dev/tty
?? ?Linux系統(tǒng)提供了兩個(gè)對(duì)Shell編程非常有用的特殊文件,/dev/null和/dev/tty。其中/dev/null將會(huì)丟掉所有寫入它的數(shù)據(jù),換句換說,當(dāng)程序?qū)?shù)據(jù)寫入到此文件時(shí),會(huì)認(rèn)為它已經(jīng)成功完成寫入數(shù)據(jù)的操作,但實(shí)際上什么事都沒有做。如果你需要的是命令的退出狀態(tài),而非它的輸出,此功能會(huì)非常有用,見如下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
?? ?
?? ?下面我們?cè)賮砜?dev/tty的用途。當(dāng)程序打開此文件是,Linux會(huì)自動(dòng)將它重定向到一個(gè)終端窗口,因此該文件對(duì)于讀取人工輸入時(shí)特別有用。見如下Shell代碼:
?? ?/> vi test_dev_tty.sh
?? ?
??? #!/bin/bash
?? ?printf "Enter new password: "?? ?#提示輸入
?? ?stty -echo?? ??? ??? ??? ??? ??? ??????? #關(guān)閉自動(dòng)打印輸入字符的功能
?? ?read password < /dev/tty?? ??? ? #讀取密碼
?? ?printf "\nEnter again: "?? ??? ????? #換行后提示再輸入一次
?? ?read password2 < /dev/tty?? ??? #再讀取一次以確認(rèn)
?? ?printf "\n"?? ??? ??? ??? ??? ??? ??????? #換行
?? ?stty echo?? ??? ??? ??? ??? ??? ???????? #記著打開自動(dòng)打印輸入字符的功能
?? ?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
二.?? ?簡(jiǎn)單的命令跟蹤:
?? ?Linux Shell提供了兩種方式來跟蹤Shell腳本中的命令,以幫助我們準(zhǔn)確的定位程序中存在的問題。下面的代碼為第一種方式,該方式會(huì)將Shell腳本中所有被執(zhí)行的命令打印到終端,并在命令前加"+":加號(hào)的后面還跟著一個(gè)空格。
?? ?/> 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選項(xiàng)將打開腳本的執(zhí)行跟蹤功能。
?? ?+ wc -l?????????????????????????????? #被跟蹤的兩條Shell命令
?? ?+ who
?? ?2?????????????????????????????????????? #實(shí)際輸出結(jié)果。
?? ?Linux Shell提供的另一種方式可以只打印部分被執(zhí)行的Shell命令,該方法在調(diào)試較為復(fù)雜的腳本時(shí),顯得尤為有用。
?? ?/> 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ī)則,一個(gè)是基本正則表達(dá)式(BRE),另一個(gè)是擴(kuò)展正則表達(dá)式(ERE)。
?? ?下面是這兩種表達(dá)式的語法列表,需要注意的是,如果沒有明確指出的Meta字符,其將可同時(shí)用于BRE和ERE,否則將盡適用于指定的模式。
| 正則元字符 | 模式含義 | 用例 |
| \ | 通常用于關(guān)閉其后續(xù)字符的特殊意義,恢復(fù)其原意。 | \(...\),這里的括號(hào)僅僅表示括號(hào)。 |
| . | 匹配任何單個(gè)字符。 | a.b,將匹配abb、acb等 |
| * | 匹配它之前的0-n個(gè)的單個(gè)字符。 | a*b,將匹配ab、aab、aaab等。 |
| ^ | 匹配緊接著的正則表達(dá)式,在行的起始處。 | ^ab,將匹配abc、abd等,但是不匹配cab。 |
| $ | 匹配緊接著的正則表達(dá)式,在行的結(jié)尾處。 | ab$,將匹配ab、cab等,但是不匹配abc。 |
| [...] | 方括號(hào)表達(dá)式,匹配其內(nèi)部任何字符。其中-表示連續(xù)字符的范圍,^符號(hào)置于方括號(hào)里第一個(gè)字符則有反向的含義,即匹配不在列表內(nèi)(方括號(hào))的任何字符。如果想讓]和-表示其原意,需要將其放置在方括號(hào)的首字符位置,如[]ab]或[-ab],如這兩個(gè)字符同時(shí)存在,則將]放置在首字符位置,-放置在最尾部,如[]ab-]。 | [a-bA-Z0-9!]表示所有的大小寫字母,數(shù)字和感嘆號(hào)。[^abc]表示a、b、c之外的所有字符。[Tt]om,可以匹配Tom和tom。 |
| \{n,m\} | 區(qū)間表達(dá)式,匹配在它前面的單個(gè)字符重復(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。 |
| \(...\) | 將圓括號(hào)之間的模式存儲(chǔ)在特殊“保留空間”。最多可以將9個(gè)獨(dú)立的子模式存儲(chǔ)在單個(gè)模式中。匹配于子模式的文本,可以通過轉(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) | 和前面的星號(hào)相比,+匹配的是前面正則表達(dá)式的1-n個(gè)實(shí)例。 | ? |
| ?(ERE) | 匹配前面正則表達(dá)式的0個(gè)或1個(gè)。 | ab?僅匹配a或ab。 |
| |(ERE) | 匹配于|符號(hào)前后的正則表達(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)點(diǎn)字符。 | ? |
| [: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)用實(shí)例:
??? /> 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后面的冒號(hào)表示字段之間的分隔符,-f表示取分割后的哪些字段
?? ?root:root???????????????????????????????? #這里取出的是第一個(gè)和第五個(gè)字段。
?? ?bin:bin
?? ?daemon:daemon
?? ?adm:adm
?? ?... ...
??? />cut -d: -f 3- /etc/passwd?????? #從第三個(gè)字段開始顯示,直到最后一個(gè)字段。
??? 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àng)實(shí)現(xiàn),其不能與-d選項(xiàng)共存。
??? /> cut -c 1-4 /etc/passwd????????? #取每行的前1-4個(gè)字符。
??? /> cut -c-4 /etc/passwd??????????? #取每行的前4個(gè)字符。
??? root
?? ?bin:
?? ?daem
?? ?adm:
??? ... ...
??? /> cut -c4- /etc/passwd??????????? #取每行的第4個(gè)到最后字符。
?? ?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?????????? #取每行的第一個(gè)和第四個(gè)字符。
?? ?rt
?? ?b:
?? ?dm
?? ?a:
?? ?... ...
??? /> cut -c1-4,5 /etc/passwd??????? #取每行的1-4和第5個(gè)字符。
?? ?root:
?? ?bin:x
?? ?daemo
?? ?adm:x
五.?? ?計(jì)算行數(shù)、字?jǐn)?shù)以及字符數(shù):
?? ?Linux提供了一個(gè)簡(jiǎn)單的工具wc用于完成該功能,見如下用例:
??? /> echo This is a test of the emergency broadcast system | wc
?? ?1?? ?9?? ?49????????????????????????????? #1行,9個(gè)單詞,49個(gè)字符
??? /> echo Testing one two three | wc -c
?? ?22???????????????????????????????????????? #22個(gè)字符
??? /> echo Testing one two three | wc -l
?? ?1?????????????????????????????????????????? #1行
??? /> echo Testing one two three | wc -w
?? ?4?????????????????????????????????????????? #4個(gè)單詞
??? /> wc /etc/passwd /etc/group??? #計(jì)算兩個(gè)文件里的數(shù)據(jù)。
?? ?39?? 71? 1933? /etc/passwd
? ? 62?? 62? 906??? /etc/group
?? ?101 133 2839? 總用量
六.?? ?提取開頭或結(jié)尾數(shù)行:
?? ?有時(shí),你會(huì)需要從文本文件里把幾行字,多半是靠近開頭或結(jié)尾的幾行提取出來。如查看工作日志等操作。Linux Shell提供head和tail兩個(gè)命令來完成此項(xiàng)工作。見如下用例:
??? /> 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
?? ?如果使用者想查看不間斷增長(zhǎng)的日志(如服務(wù)程序輸出的),可以使用tail的-f選項(xiàng),這樣可以讓tail命令不會(huì)自動(dòng)退出,必須通過CTRL+C命令強(qiáng)制退出,因此該選項(xiàng)不適合用于Shell腳本中,見如下用例:
??? /> tail -f -n 5 my_server_log
?? ?... ...
?? ?^C???????????????????????????????????????? #CTRL+C退出到命令行提示符狀態(tài)。
總結(jié)
以上是生活随笔為你收集整理的Linux Shell常用技巧(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux入门基础知识】Linux 脚
- 下一篇: Linux Shell常用技巧(二)