自己編寫的一個查找Linux進程的Shell腳本

#! /bin/bash
echo "請輸入進程名:"
read process
echo "你要查找的進程是 $process ,正在查找..."
ps > text1
grep "$process" text1
 
declare -i a=$?
if [ $a -eq 0 ]
then
echo "該進程存在"
else
echo "該進程不存在"
fi
rm text1
學到的東西如下:
$?   表示上面最近一次命令的退出狀態
if [ $a -eq 0 ]  注意中括號裏面的空格
ps 顯示系統中所有進程
grep 文本搜索命令,功能強大,詳見Linux命令大全。
1. 什麼是grep
grep命令在文件中全局查找指定的正則表達式,並且打印所有包含該表達式的行。
2. grep家族
grep家族由命令grep, egrep, fgrep組成。 egrep和fgrep都是grep的變體。
1)egrep
2) fgrep
3) GNU grep
Linux使用的是由自由軟件基金會提供的grep的免費版本,稱作GNU grep。GNU版的grep擴展了基本的正則表達式元字符集,增加了與POSIX的一致性,並且包括很多新的命令行選項。他們還提供了一個名爲rgrep的遞歸式grep,用於逐級搜索整個目錄樹。
3.grep是如何工作的?
grep命令在一個或多個文件中查找某個字符模式。。
grep命令的格式:
grep <模式> filename filename
模式可以是一個被引號括起來的字符串,也可以是單個詞,但如果這個模式中包含空格,就必須用引號把它括起來。位於模式之後的所有單詞都被視爲文件名。
grep的返回值:
grep只是將輸出發送到屏幕,它不會對輸入文件進行任何修改或變化。
1)如果查找成功,文件中的相應行會顯示在屏幕上(退出狀態$?=0)
2)如果沒有找到指定的模式,就不會有任何輸出  (退出狀態$?=1)
3)如果所指定的文件不是一個合法的文件,屏幕上就會顯示報錯信息(退出狀態$?=2)
grep的輸入:
1)文件
如: grep Tom /etc/passwd (在文件/etc/passwd中查找Tom)
2)標準輸入
如果忘了指定文件,grep會以爲你要它從標準輸入(即鍵盤)獲取輸入,於是停下來等着你鍵入一些字符
3)管道
如:ps -ef | grep root  (ps -ef 將顯示正在系統上運行的所有進程,所有包含root的行被顯示在屏幕上)
元字符表達的含義不同於字符本身的字面含義。grep命令支持很多正則表達式元字符,以使用戶更精確地定義要查找的模式:
1) ^ 行首定位符
2) $ 行尾定位符
3). 匹配一個字符
4) * 匹配0個或多個前導字符
5)[] 匹配一組字符中任一個
6) [^]匹配不在指定字符組內的字符
7) \< 詞首定位符
8) \> 詞尾定位符
9) \(...\)標記匹配到的字符
10) x\{m\} 匹配出現m次字符x的行
x\{m,\}  匹配至少出現m次字符x的行
x\{m, n\} 匹配出現m次到n次字符x的行
5.grep支持的命令選項
grep提供了很多命令選項用於調整執行查找或顯示結果的方式。
格式: grep 選項  模式  文件名
選項:
1) -b 在每一行前面加上其所在的塊號,根據上下文定位磁盤塊時可能會用到
2) -c 顯示匹配到的行的數目,而不顯示行的內容
3) -h 不顯示文件名
4) -i 忽略大小寫敏感
5) -l 只列出匹配所在文件的文件名(每個文件名只列一次),文件名之間用換行符分割
6) -n 在每一行前面加上它在文件中的相對行號
7) -s 無聲操作,即只顯示報錯信息,來檢查退出狀態
8)-v 反向查找,只顯示不匹配的行
9) -w 把表達式作爲詞來查找,就好像它被 \< 和 \> 所包含一樣。只適用於grep
6.egrep
6.1 egrep使用的正則表達式元字符
1)^ 行首定位符
2) $ 行尾定位符
3) 。 匹配一個字符
4) *  匹配0個或多個前導字符
5)[] 匹配一組字符中的任一個
6) [^] 匹配不在指定字符組內的字符
6.2 egrep新增的元字符
1)+ 匹配1個或多個加號前的字符
2) ?匹配0個或1個前導字符
3)a|b 匹配a或b
4) ()字符組
7. fgrep
8.1 GNU grep的變體
1) grep  <=> grep -G
格式: grep 'pattern' filename(s)
grep -G 'pattern' filename(s)
注意: pattern 可以使用基本元字符
2) egrep <=> grep -E 可以使用擴展集
格式: egrep 'pattern' filename(s)
grep -E 'pattern' filename(s)
注意: pattern 可以使用擴展元字符
另外GNU grep 還支持:
1) 固定的grep (查找文件中包含指定字符串的行)
fgrep <=> grep -F
格式:  fgrep 'pattern' filename(s)
grep -F 'pattern' filename(s)
2) 遞歸的grep (遞歸地搜索指定目錄下包含模式的所有文件)
rgrep <=> grep -R
格式: rgrep 'pattern' filename(s)
grep -R 'pattern' filename(s)
rgrep支持的正則表達式有:
^                匹配行首
$                匹配行尾
.                匹配除換行符外的任意字符
*                匹配0個或多個前導字符
[...]            匹配括號中的單個字符
\{...\}          用於匹配字符重複
\(...\) \2..\1   標籤
+                匹配1個或多個前導字符
?                匹配0個或1個前導字符
\e               匹配ESC字符
\d               僅匹配數字
8.2 GNU grep支持的正則表達式元字符
基本集  擴展集
  ^ 行首定位符 支持
  $ 行尾定位符 支持
  . 匹配單個字符(包括空格) 支持
  * 匹配0或多個字符 支持
 [ ] 匹配集合中的一個字符 支持
 [^ ] 匹配非集合中的一個字符 支持
 \< 詞首定位符 不支持
 \> 詞尾定位符 不支持
 \(...\) 標籤匹配  (...)(...)\1\2
 x\{m\} 匹配字符x出現了m 次的行  x{m}
 x\{m,\} 匹配字符x出現了至少m次的行  x{m.}
 x\{\m, n\} 匹配字符x出現了m到n次的行  x{m,n}
 \w 所有字母與數字即[a-zA-Z0-9]  支持
 \W 所有非字符(字母與數字之外的字符) 即[^a-zA-Z0-9]  支持
 \b 詞邊界如\bwork\b盡匹配work這個單詞  支持
   + 匹配1個或多個前導字符
   ? 匹配0個或多個前導字符
   a|b 匹配a或b
   () 組字符
8.3 POSIX(可移植操作系統接口)類
POSIX是一個保證程序能夠跨越操作系統移植的工業標準。爲了實現可移植性,POSIX認可不同的國家和地區在字符編碼,貨幣以及時間和日期的表示方式上的不同。爲處理不同類型的字符,POSIX在基本正則表達式與擴展正則表達式的基礎上加入了括號字符類的字符:
1)[[:alnum:]]  字母與數字兩種字符
2)[[:alpha:]]  字母
3)[[:cntrl:]]  控制字符
4)[[:digit:]]  數字
5)[[:graph:]]  非空字符(不包含空格,控制字符等)
6)[[:lower:]]  小寫字符
7)[[:print:]]  與[[:graph:]] 類似,但包含空格字符
8)[[:punct:]]  標點
9)[[:space:]]  所有的空白字符(換行符, 空格符,製表符)
10)[[:upper:]]  大寫字符
11)[[:xdigit:]] 十六進制數字字符(0-9a-fA-F)
8.4 GNU grep支持的命令選項
GNU grep選項在grep所有不同的變體(grep -G, grep -E, grep -F)上都能夠工作。
1)-# (#代表一個整數,將匹配行前後#行的內容一同打印出來, 如 grep -2 pattern filename將打印出匹配行及匹配行的前兩行和後兩行)
2)-A # (打印匹配行後面#行的內容,即匹配行及它後面指定的#行內容)
3) -B #  (打印匹配行前面#行的內容,即匹配行及它前面指定的#行內容)
4) -C #  (等價於 -2 選項)
5) -V (打印grep版本信息)
6) -a, --text, --binary-files=text (將二進制文件當作文本文件處理)
7) -b, --byte-offset (在輸出的每行前顯示偏移字節數)
8) -c, --count (爲每個輸入文件打印成功匹配的行數)
9) -v, --revert-match (打印一些未匹配的行數)
10) -D action, --devices=action (如果輸入文件爲一個設備,如套接字或管道,則action默認從該設備讀,就如同讀一個普通文件一樣。如果action爲skip,則該設備被忽略)
11) -e pattern, -regexp=pattern (使用字面pattern作爲模式,這時保護以 - 開頭的模式非常有幫助)
12) -f FILE, --file=FILE (從FILE中獲得模式,每行一個。空文件包含0個模式,因此什麼也不能匹配)
13)--help (顯示有關grep命令行選項及錯誤報告地址的幫助信息,然後退出)
14) -h (當搜索多個文件時,禁止輸出文件名前綴)
15) -i (忽略模式和輸入文件的大小寫區別)
16) -L (僅打印所有未能匹配模式的文件名)
17) -l (僅打印所有正確匹配模式的文件名)
18) -m # (如果文件是標準輸入或正規文件,在找到指定數量(#)的匹配行後停止讀文件)
19) -n (在匹配成功的輸出行前加上行號作前綴)
20) -q (禁止正規輸出,可以用來代替 -n)
21) -r, -R (對列出的目錄,遞歸地讀並處理這些目錄中的所有文件;也就是指該目錄下的所有目錄)
22) -s (禁止顯示文件不存在或文件不可讀的錯誤信息)
23)-w (僅選擇包含詞匹配的行。匹配詞邊界上包含字母,數字和下劃線的字符串)
24) -x (僅選擇精確匹配整行的那些匹配)
25) -y (與已廢除的 -i 同義)
26) -U (將文件作爲二進制文件處理。僅有MS-DOS和MS-Windows支持該選項)
27) -u (報告UNIX風格的字節偏移。這個選項僅在同時使用-b 選項的情況下才有效;僅有MS-DOS和MS-Windows支持該選項)
28) -Z (在文件名的末尾放上ASCII空字符以取代換行符)
9.練習1-grep 命令與正則表達式元字符
2). grep  -n  '^jack' /etc/passwd (grep的輸入可以來自文件, grep在文件/etc/passwd中查找以jack爲行首的行
3). grep  'john' /etc/passwd (grep的輸入可以來自文件,在/etc/passwd文件查找是否有包含john的行)
5). grep  NW  d* (打印所有以d開頭的文件中包含NW的所有行)
6). grep  '^n' datafile (打印所有以字母n開頭的行)
7). grep  '4$' datafile (打印所有以數字4結尾的行)
8). grep  'TB Savage' datafile (打印包含 TB Savage的行, 如果不加'' 只有TB會被當作模式, 而Savage 會被當作文件)
9). grep '5\..' datafile (打印包含5.後跟任意字符的行, .這個元字符通常代表單個字符,除非它被\轉義,被轉義後就不再是特殊的元字符,而只是代表本身,即一個句號)
10). grep  '\.5' datafile (打印包含.5的行)
11). grep  '^[we]' datafile (打印以w或e爲首的行)
12). grep  '[^0-9]' datafile (打印包含非數字字符的行, 如果某行有非數字也有數字,那麼這行還是被顯示了,因爲它也包含非數字)
13). grep '^[0-9]' datafile (打印以數字爲打頭的行)
14). grep '[A-Z][A-Z] [A-Z]' datafile (打印包含兩個大寫字母后跟一個空白和一個大寫字母的行)
15). grep 'ss* ' datafile (打印包含一個s後跟0個或者多個s再跟一個空白的行)
16). grep '[a-z]\{9\}' datafile (打印包含連續9個小寫字母的行)
17). grep  '\(3\)\.[0-9].*\1    *\1' datafile (打印包含一個3後跟一個.,0個或者多個數字, 0個或多個空格最後再跟一個3的行)
18). grep '\<north' datafile (打印包含以north開頭的單詞的行)
19). grep '\<north\>' datafile (打印包含單詞north的行)
20). grep '\<[a-z].*n\>' datafile (打印包含以一個小寫字母開頭後跟0或多個任意字符以n結尾的單詞的行)
21). ls -l | grep '^d'         (打印所有的目錄)
22). egrep 'NW|EA' datafile     (打印包含NW或EA的行)
23). egrep '3+' datafile        (打印包含1個或多個3的行)
24). egrep '2\.?[0-9]' datafile (打印包含2後跟0或1個.再跟一個數字的行)
25). egrep '(no)+' datafile     (打印包含1個或多個no組的行)
26). egrep 'S(h|u)' datafile    (打印包含S後跟h或u的行)
27). egrep 'Sh|u' datafile      (打印包含Sh或u的行)
28). fgrep '[A-Z]****[0-9]' file (打印包含字符串A-Z]****[0-9]的行)
29). grep '[[:space:]]\.[[:digit:]][[:space:]]' datafile (打印包含一個空格後跟一個數字,一個空格的行)
30). grep -E '[[:space:]]\.[[:digit:]][[:space:]]' datafile (打印包含一個空格後跟一個數字,一個空格的行)
31). egrep '[[:space:]]\.[[:digit:]][[:space:]]' datafile (打印包含一個空格後跟一個數字,一個空格的行)
32). grep '^n\w*\W' datafile (打印以一個n打頭後跟0個或多個的字母或數字再跟一個非字母數字字符的行)
33). grep '\bnorth\b' datafile (打印包含詞north的行,其實可以用\<north\>替換)
34). grep 'NW\|EA' datafile <=> egrep 'NW|EA' datafile <=> grep -E 'NW|EA' datafile
(打印包含NW或EA的行)
35). grep '3\+' datafile  <=> egrep '3+' datafile <=> grep -E '3+' datafile
(打印包含1個或多個3的行)
36). grep '2\.\?[0-9]' datafile <=>egrep '2\.?[0-9]' datafile <=>grep -E '2\.?[0-9]' datafile
(打印包含一個2後跟0個或1個句點再跟一個數字的行)
37). grep '\(no\)\+' datafile <=> egrep '(no)+' datafile <=> grep -E '(no)+' datafile
(打印包含1個或多個no組的行)
38). grep -E  '\w+\W+[ABC]' datafile <=> grep '\w\+\W\+[A-Z]' datafile
(打印包含1個或多個數字或字母后跟一個或多個非數字字母自符再跟一個大寫字母的行)
39). egrep 'S(h|u)' datafile <=> grep -E 'S(h|u)' datafile <=> grep 'S\(h\|u\)' datafile
(打印包含S後跟h或u字符的行)
40). egrep 'Sh|u' datafile <=> grep -E 'Sh|u' datafile <=> grep 'Sh\|u' datafile
(打印包含Sh或u的行)
41). grep '\<north\>' datafile <=> egrep '\<north\>' datafile<=>grep -E '\<north\>' datafile
(無論哪個grep變體,都必須在詞定位符前加\, 打印包含詞north的行)
42). egrep 'w(es)t.*\1' datafile<=>grep -E 'w(es)t.*\1' datafile<=>grep 'w\(es\)t.*\1'
datafile (打印包含west後跟0個或多個任意字符再跟west的行)
43). grep -r 'Tom' ./dir <=> rgrep 'Tom' ./dir (打印dir目錄下的文件中包含Tom的行,打印結果將標記出哪個文件
10。練習2-grep 命令選項
1) grep -3 'word' datafile (打印包含word的行,以及匹配行前後3行的內容)
2) grep -A3 'word' datafile (打印包含word的行,以及匹配行後3行的內容)
3) grep -B3 'word' datafile (打印包含word的行,以及匹配行前3行的內容)
4) grep -C 'word' datafile  (打印包含word的行,以及匹配行前後2行的內容)
5) grep -V (打印grep 版本)
6) grep -c  'word' datafile   (打印包含word的行,注意某行中出現word多次只算一次)
7) grep -e '-word' datafile   (打印包含-word的行,加了-e, 引號中的字符將被同等對待,-就不會被視爲選項)
8) grep -f patternfile datafile   (打印包含文件中模式的行,注意把每個模式左對齊寫在patternfile)
9) grep -h 'word' datafile1 file2 (打印多個文件中包含word的行,不顯示文件名前綴)
10) grep -i 'word' datafile    (打印包含word的行,忽略大小寫)
11) grep -L 'word' d*  (打印行中不包含word的文件名)
12) grep -l 'word' *   (打印行中包含word的文件名)
13) grep -m 2 'word' datafile  (打印包含word的行,每個文件2次匹配後就停止,注意同行中出現多次只算一次,這裏的2指的是不同行)
14) grep -n 'word' datafile  (打印包含word的行,輸出匹配行的行號作爲前綴)
15) grep -q 'word' datafile (只要文件存在,不打印匹配了與否,要想知道是否匹配了,得查看退出狀態$?)
16) grep -r 'word' dir      (打印dir目錄下的文件中包含word的行,匹配行前會列出文件名)
17) grep -s 'word' datafile (即使有文件不存在或文件不可讀這樣的的錯誤信息也不顯示)
18) grep -v 'word' datafile (打印不包含word的行)
19) grep -w 'word' datafile (打印包含詞word的行,注意如果word是某個詞的一部分將不會顯示,詞不是單詞,詞可以包含字母數字和下劃線)
20) grep -x 'word' datafile (打印以word爲整行內容的行)
21) grep -Z 'word' datafile file (文件名末尾替換爲空字符如 file:XXX 將替換爲fileXXX)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章