Shell 編程
grep命令
grep:global/regular expressions/print的縮寫
grep能夠在一個或多個文件內容中搜索某一特定 字符模式、也被稱爲正則表達式
一個模式可以是一個單一的字符、一個字符串、一個單詞或一個句子
一個正則表達式是描述一組字符串的一個模式
正則表達式的構成是模仿了數學表達式,通過使用操作符將較小的表達式組合成一個新的表達式
一個正則表達式既可以是一些純文本文字,也可以是用來產生模式的一些特殊字符
正則表達式的通配符
grep支持以下正則表達式的元字(通配)符:
c*:將匹配0個(即空白)或多個字符c
.:將匹配任何一個字符而且只能是一個字符
[xyz]:將匹配方括號中的任意一個字符
[^xyz]:將匹配不包括方括號中的字符的所有字符
^:鎖定行的開頭
$:鎖定行的結尾
元字符*、+、{、|、(和 ) 失去了原義,如要恢復其原義要在之前冠以反斜線\ —— 即*、+、{、|、(、和)
grep命令的語法格式
grep 選項 模式 文件名
grep命令中常用選項如下:
-c:僅列出包含模式的行數
-i:忽略模式中的字母大小寫
-l:列出帶有匹配行的文件名
-n:在每行的最前面列出行號
-v:列出沒有匹配模式的行
-w:把表達式作爲一個完整的單字來搜尋
除了-w選項之外,其他的每個選項都可以在egrep和fgrep命令中使用
grep命令的例題
[root@dog dag]# cd backup
[root@dog backup]# grep CLERK emp.data
7369 SMITH CLERK 800 17-DEC-80
7876 ADAMS CLERK 1100 23-MAY-87
7900 JAMES CLERK 950 03-DEC-81
7934 MILLER CLERK 1300 23-JAN-82
[root@dog backup]# grep -c CLERK emp.data
4
[root@dog backup]# grep Clerk emp.data
[root@dog backup]# grep -i Clerk emp.data
7369 SMITH CLERK 800 17-DEC-80
7876 ADAMS CLERK 1100 23-MAY-87
7900 JAMES CLERK 950 03-DEC-81
7934 MILLER CLERK 1300 23-JAN-82
[root@dog backup]# grep -i clerk emp.data
7369 SMITH CLERK 800 17-DEC-80
7876 ADAMS CLERK 1100 23-MAY-87
7900 JAMES CLERK 950 03-DEC-81
7934 MILLER CLERK 1300 23-JAN-82
[root@dog backup]# grep -in Clerk emp.data
1:7369 SMITH CLERK 800 17-DEC-80
11:7876 ADAMS CLERK 1100 23-MAY-87
12:7900 JAMES CLERK 950 03-DEC-81
14:7934 MILLER CLERK 1300 23-JAN-82
[root@dog backup]# cat -n emp.data
1 7369 SMITH CLERK 800 17-DEC-80
2 7499 ALLEN SALESMAN 1600 20-FEB-81
3 7521 WARD SALESMAN 1250 22-FEB-81
4 7566 JONES MANAGER 2975 02-APR-81
5 7654 MARTIN SALESMAN 1250 28-SEP-81
6 7698 BLAKE MANAGER 2850 01-MAY-81
7 7782 CLARK MANAGER 2450 09-JUN-81
8 7788 SCOTT ANALYST 3000 19-APR-87
9 7839 KING PRESIDENT 5000 17-NOV-81
10 7844 TURNER SALESMAN 1500 08-SEP-81
11 7876 ADAMS CLERK 1100 23-MAY-87
12 7900 JAMES CLERK 950 03-DEC-81
13 7902 FORD ANALYST 3000 03-DEC-81
14 7934 MILLER CLERK 1300 23-JAN-82
[root@dog backup]# grep -v CLERK emp.data
7499 ALLEN SALESMAN 1600 20-FEB-81
7521 WARD SALESMAN 1250 22-FEB-81
7566 JONES MANAGER 2975 02-APR-81
7654 MARTIN SALESMAN 1250 28-SEP-81
7698 BLAKE MANAGER 2850 01-MAY-81
7782 CLARK MANAGER 2450 09-JUN-81
7788 SCOTT ANALYST 3000 19-APR-87
7839 KING PRESIDENT 5000 17-NOV-81
7844 TURNER SALESMAN 1500 08-SEP-81
7902 FORD ANALYST 3000 03-DEC-81
[root@dog backup]# grep ^78 CLERK emp.data
grep: CLERK: 沒有那個文件或目錄
emp.data:7839 KING PRESIDENT 5000 17-NOV-81
emp.data:7844 TURNER SALESMAN 1500 08-SEP-81
emp.data:7876 ADAMS CLERK 1100 23-MAY-87
[root@dog backup]# grep 87$ emp.data
[root@dog backup]# grep 87$ CLERK emp.data
grep: CLERK: 沒有那個文件或目錄
[root@dog backup]# exit
logout
[dag@dog ~]$ cd backup
[dag@dog backup]$ grep ^78 emp.data
7839 KING PRESIDENT 5000 17-NOV-81
7844 TURNER SALESMAN 1500 08-SEP-81
7876 ADAMS CLERK 1100 23-MAY-87
[dag@dog backup]$ grep 87$ emp.data
[dag@dog backup]$ grep 81$ emp.data
[dag@dog backup]$ grep $87 emp.data
7369 SMITH CLERK 800 17-DEC-80
7499 ALLEN SALESMAN 1600 20-FEB-81
7521 WARD SALESMAN 1250 22-FEB-81
7566 JONES MANAGER 2975 02-APR-81
7654 MARTIN SALESMAN 1250 28-SEP-81
7698 BLAKE MANAGER 2850 01-MAY-81
7782 CLARK MANAGER 2450 09-JUN-81
7788 SCOTT ANALYST 3000 19-APR-87
7839 KING PRESIDENT 5000 17-NOV-81
7844 TURNER SALESMAN 1500 08-SEP-81
7876 ADAMS CLERK 1100 23-MAY-87
7900 JAMES CLERK 950 03-DEC-81
7902 FORD ANALYST 3000 03-DEC-81
7934 MILLER CLERK 1300 23-JAN-82
[dag@dog backup]$ grep 87$ emp.data
[dag@dog backup]$ grep -i Man emp.data
7499 ALLEN SALESMAN 1600 20-FEB-81
7521 WARD SALESMAN 1250 22-FEB-81
7566 JONES MANAGER 2975 02-APR-81
7654 MARTIN SALESMAN 1250 28-SEP-81
7698 BLAKE MANAGER 2850 01-MAY-81
7782 CLARK MANAGER 2450 09-JUN-81
7844 TURNER SALESMAN 1500 08-SEP-81
[dag@dog backup]$ grep -c Man emp.data
0
[dag@dog backup]$ grep -i MAN emp.data
7499 ALLEN SALESMAN 1600 20-FEB-81
7521 WARD SALESMAN 1250 22-FEB-81
7566 JONES MANAGER 2975 02-APR-81
7654 MARTIN SALESMAN 1250 28-SEP-81
7698 BLAKE MANAGER 2850 01-MAY-81
7782 CLARK MANAGER 2450 09-JUN-81
7844 TURNER SALESMAN 1500 08-SEP-81
[dag@dog backup]$ grep -c MAN emp.data
7
[dag@dog backup]$ grep -i Clerk emp.data | sort -k4
7876 ADAMS CLERK 1100 23-MAY-87
7934 MILLER CLERK 1300 23-JAN-82
7369 SMITH CLERK 800 17-DEC-80
7900 JAMES CLERK 950 03-DEC-81
[dag@dog backup]$ grep -i Clerk emp.data | sort -n -k4
7369 SMITH CLERK 800 17-DEC-80
7900 JAMES CLERK 950 03-DEC-81
7876 ADAMS CLERK 1100 23-MAY-87
7934 MILLER CLERK 1300 23-JAN-82
[dag@dog backup]$ grep '1..0' emp.data
7499 ALLEN SALESMAN 1600 20-FEB-81
7521 WARD SALESMAN 1250 22-FEB-81
7654 MARTIN SALESMAN 1250 28-SEP-81
7844 TURNER SALESMAN 1500 08-SEP-81
7876 ADAMS CLERK 1100 23-MAY-87
7934 MILLER CLERK 1300 23-JAN-82
[dag@dog backup]$ grep '[12]..0' emp.data
7499 ALLEN SALESMAN 1600 20-FEB-81
7521 WARD SALESMAN 1250 22-FEB-81
7654 MARTIN SALESMAN 1250 28-SEP-81
7698 BLAKE MANAGER 2850 01-MAY-81
7782 CLARK MANAGER 2450 09-JUN-81
7844 TURNER SALESMAN 1500 08-SEP-81
7876 ADAMS CLERK 1100 23-MAY-87
7934 MILLER CLERK 1300 23-JAN-82
[dag@dog backup]$ grep '[12]..[05]' emp.data
7499 ALLEN SALESMAN 1600 20-FEB-81
7521 WARD SALESMAN 1250 22-FEB-81
7566 JONES MANAGER 2975 02-APR-81
7654 MARTIN SALESMAN 1250 28-SEP-81
7698 BLAKE MANAGER 2850 01-MAY-81
7782 CLARK MANAGER 2450 09-JUN-81
7844 TURNER SALESMAN 1500 08-SEP-81
7876 ADAMS CLERK 1100 23-MAY-87
7934 MILLER CLERK 1300 23-JAN-82
[dag@dog backup]$ grep -v '[12]..[05]' emp.data
7369 SMITH CLERK 800 17-DEC-80
7788 SCOTT ANALYST 3000 19-APR-87
7839 KING PRESIDENT 5000 17-NOV-81
7900 JAMES CLERK 950 03-DEC-81
7902 FORD ANALYST 3000 03-DEC-81
[dag@dog backup]$ grep '[89].0' emp.data
7369 SMITH CLERK 800 17-DEC-80
7698 BLAKE MANAGER 2850 01-MAY-81
7900 JAMES CLERK 950 03-DEC-81
[dag@dog backup]$ grep -w '[89].0' emp.data
7369 SMITH CLERK 800 17-DEC-80
7900 JAMES CLERK 950 03-DEC-81
[dag@dog backup]$ grep -w MAN emp.data
[dag@dog backup]$ cd /etc
[dag@dog etc]$ grep -l root group passwd hosts
group
passwd
[dag@dog etc]$ ls -l group passwd hosts
-rw-r--r--. 1 root root 885 5月 18 01:19 group
-rw-r--r--. 1 root root 158 1月 12 2010 hosts
-rw-r--r--. 1 root root 1813 5月 17 23:12 passwd
[dag@dog etc]$ hear -2 group
bash: hear: command not found
[dag@dog etc]$ head -2 group
root:x:0:
bin:x:1:bin,daemon
[dag@dog etc]$ head -2 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[dag@dog etc]$ cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[dag@dog etc]$ grep '5*' 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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
dag:x:500:500:dad dog:/home/dag:/bin/bash
cat:x:501:501::/home/cat:/bin/bash
fox:x:502:502::/home/fox:/bin/bash
pig:x:503:503::/home/pig:/bin/bash
[dag@dog etc]$ grep '55*' passwd
sync:x:5:0:sync:/sbin:/bin/sync
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
dag:x:500:500:dad dog:/home/dag:/bin/bash
cat:x:501:501::/home/cat:/bin/bash
fox:x:502:502::/home/fox:/bin/bash
pig:x:503:503::/home/pig:/bin/bash
[dag@dog etc]$ grep -w '50.' passwd
dag:x:500:500:dad dog:/home/dag:/bin/bash
cat:x:501:501::/home/cat:/bin/bash
fox:x:502:502::/home/fox:/bin/bash
pig:x:503:503::/home/pig:/bin/bash
[dag@dog etc]$ grep '/bash$' passwd
root:x:0:0:root:/root:/bin/bash
dag:x:500:500:dad dog:/home/dag:/bin/bash
cat:x:501:501::/home/cat:/bin/bash
fox:x:502:502::/home/fox:/bin/bash
pig:x:503:503::/home/pig:/bin/bash
[dag@dog etc]$ ps -e | grep ftp
7968 ? 00:00:00 sftp-server
9277 ? 00:00:00 sftp-server
[dag@dog etc]$ ps -e | grep ora