#! /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)