拿小本本記下的Linux Shell經常使用技巧(一)

一. 特殊文件: /dev/null和/dev/ttymysql

Linux系統提供了兩個對Shell編程很是有用的特殊文件,/dev/null和/dev/tty。其中/dev/null將會丟掉全部寫入它的數據,換句換說,當程序將數據寫入到此文件時,會認爲它已經成功完成寫入數據的操做,但實際上什麼事都沒有作。若是你須要的是命令的退出狀態,而非它的輸出,此功能會很是有用,見以下Shell代碼:git

/> vi test_dev_null.sh正則表達式

#!/bin/bashsql

if grep hello TestFile > /dev/null編程

thenbash

echo "Found"服務器

elsessh

echo "NOT Found"工具

fispa

在vi中保存並退出後執行如下命令:

/> chmod +x test_dev_null.sh
#使該文件成爲可執行文件

/> cat > TestFile

hello my friend

CTRL + D #退出命令行文件編輯狀態

/> ./test_dev_null.sh

Found #這裏並無輸出grep命令的執行結果。

將以上Shell腳本作以下修改:

/> vi test_dev_null.sh

#!/bin/bash

if grep hello TestFile

then

echo "Found"

else

echo "NOT Found"

fi

在vi中保存退出後,再次執行該腳本:

/> ./test_dev_null.sh

hello my friend #grep命令的執行結果被輸出了。

Found

下面咱們再來看/dev/tty的用途。當程序打開此文件是,Linux會自動將它重定向到一個終端窗口,所以該文件對於讀取人工輸入時特別有用。見以下Shell代碼:

/> vi test_dev_tty.sh

#!/bin/bash

printf "Enter new password: " #提示輸入

stty -echo #關閉自動打印輸入字符的功能

read password < /dev/tty #讀取密碼

printf "\nEnter again: " #換行後提示再輸入一次

read password2 < /dev/tty #再讀取一次以確認

printf "\n" #換行

stty echo #記着打開自動打印輸入字符的功能

echo "Password = " $password #輸出讀入變量

echo "Password2 = " $password2

echo "All Done"

在vi中保存並退出後執行如下命令:

/> chmod +x test_dev_tty.sh
#使該文件成爲可執行文件

/> ./test_dev_tty

Enter new password: #這裏密碼的輸入被讀入到腳本中的password變量

Enter again: #這裏密碼的輸入被讀入到腳本中的password2變量

Password = hello

Password2 = hello

All Done

二. 簡單的命令跟蹤:

Linux Shell提供了兩種方式來跟蹤Shell腳本中的命令,以幫助咱們準確的定位程序中存在的問題。下面的代碼爲第一種方式,該方式會將Shell腳本中全部被執行的命令打印到終端,並在命令前加"+":加號的後面還跟着一個空格。

/> cat > trace_all_command.sh

who | wc -l #這兩條Shell命令將輸出當前Linux服務器登陸的用戶數量

CTRL + D #退出命令行文件編輯狀態

/> chmod +x trace_all_command.sh

/> sh -x ./trace_all_command.sh
#Shell執行器的-x選項將打開腳本的執行跟蹤功能。

+ wc -l #被跟蹤的兩條Shell命令

+ who

2 #實際輸出結果。

Linux Shell提供的另外一種方式能夠只打印部分被執行的Shell命令,該方法在調試較爲複雜的腳本時,顯得尤其有用。

/> cat > trace_patial_command.sh

#! /bin/bash

set -x #從該命令以後打開跟蹤功能

echo 1st echo #將被打印輸出的Shell命令

set +x #該Shell命令也將被打印輸出,然而在該命令被執行以後,全部的命令將再也不打印輸出

echo 2nd echo #該Shell命令將再也不被打印輸出。

CTRL + D #退出命令行文件編輯狀態

/> chmod +x trace_patial_command.sh

/> ./trace_patial_command.sh

+ echo 1st echo

1st echo

+ set +x

2nd echo

三. 正則表達式基本語法描述:

Linux Shell環境下提供了兩種正則表達式規則,一個是基本正則表達式(BRE),另外一個是擴展正則表達式(ERE)。

下面是這兩種表達式的語法列表,須要注意的是,若是沒有明確指出的Meta字符,其將可同時用於BRE和ERE,不然將盡適用於指定的模式。

正則元字符模式含義用例\一般用於關閉其後續字符的特殊意義,恢復其原意。\(...\),這裏的括號僅僅表示括號。.匹配任何單個字符。a.b,將匹配abb、acb等*匹配它以前的0-n個的單個字符。a*b,將匹配ab、aab、aaab等。^匹配緊接着的正則表達式,在行的起始處。^ab,將匹配abc、abd等,可是不匹配cab。$匹配緊接着的正則表達式,在行的結尾處。ab$,將匹配ab、cab等,可是不匹配abc。[...]方括號表達式,匹配其內部任何字符。其中-表示連續字符的範圍,^符號置於方括號裏第一個字符則有反向的含義,即匹配不在列表內(方括號)的任何字符。若是想讓]和-表示其原意,須要將其放置在方括號的首字符位置,如[]ab]或[-ab],如這兩個字符同時存在,則將]放置在首字符位置,-放置在最尾部,如[]ab-]。[a-bA-Z0-9!]表示全部的大小寫字母,數字和感嘆號。[^abc]表示a、b、c以外的全部字符。[Tt]om,能夠匹配Tom和tom。\{n,m\}區間表達式,匹配在它前面的單個字符重複出現的次數區間,\{n\}表示重複n次;\{n,\}表示至少重複n次;\{n,m\}表示重複n到m次。ab\{2\}表示abb;ab\{2,\}表示abb、abbb等。ab\{2,4\}表示abb、abbb和abbbb。\(...\)將圓括號之間的模式存儲在特殊「保留空間」。最多能夠將9個獨立的子模式存儲在單個模式中。匹配於子模式的文本,能夠經過轉義序列\1到\9,被重複使用在相同模式裏。\(ab\).*\1表示ab組合出現兩次,兩次之間可存在任何數目的任何字符,如abcdab、abab等。{n,m}(ERE)其功能等同於上面的\{n,m\},只是再也不寫\轉義符了。ab+匹配ab、abbb等,可是不匹配a。+(ERE)和前面的星號相比,+匹配的是前面正則表達式的1-n個實例。 ?(ERE)匹配前面正則表達式的0個或1個。ab?僅匹配a或ab。|(ERE)匹配於|符號先後的正則表達式。(ab|cd)匹配ab或cd。[:alpha:]匹配字母字符。[[:alpha:]!]ab$匹配cab、dab和!ab。[:alnum:]匹配字母和數字字符。[[:alnum:]]ab$匹配1ab、aab。[:blank:]匹配空格(space)和Tab字符。[[:alnum:]]ab$匹配1ab、aab。[:cntrl:]匹配控制字符。 [:digit:]匹配數字字符。 [:graph:]匹配非空格字符。 [:lower:]匹配小寫字母字符。 [:upper:]匹配大寫字母字符。 [:punct:]匹配標點字符。 [:space:]匹配空白(whitespace)字符。 [:xdigit:]匹配十六進制數字。 \w匹配任何字母和數字組成的字符,等同於[[:alnum:]_] \W匹配任何非字母和數字組成的字符,等同於[^[:alnum:]_] \<\>匹配單詞的起始和結尾。\<read匹配readme,me\>匹配readme。

下面的列表給出了Linux Shell中經常使用的工具或命令分別支持的正則表達式的類型。

grepsedviegrepawkBRE*** ERE **

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

cut命令是用來剪下文本文件裏的數據,文本文件能夠是字段類型或是字符類型。下面給出應用實例:

/> 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

... ...

這裏須要進一步說明的是,使用cut命令還能夠剪切以字符數量爲標量的部分字符,該功能經過-c選項實現,其不能與-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

五. 計算行數、字數以及字符數:

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
#計算兩個文件裏的數據。

39 71 1933 /etc/passwd

62 62 906 /etc/group

101 133 2839 總用量

六. 提取開頭或結尾數行:

有時,你會須要從文本文件裏把幾行字,多半是靠近開頭或結尾的幾行提取出來。如查看工做日誌等操做。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

若是使用者想查看不間斷增加的日誌(如服務程序輸出的),可使用tail的-f選項,這樣可讓tail命令不會自動退出,必須經過CTRL+C命令強制退出,所以該選項不適合用於Shell腳本中,見以下用例:

/> tail -f -n 5 my_server_log

... ...

^C #CTRL+C退出到命令行提示符狀態。

  1. 福利福利分享
相關文章
相關標籤/搜索