解釋型語言: 源程序經過翻譯一條執行一條 解釋器
編譯型語言: 事先把全部源程序都翻譯好 編譯器linux
bash編程:
指令:OS上可運行的命令
翻譯:在當前OS上查找相應命令並提交給內核的執行的過程。git
程序控制語句:
順序執行、選擇執行、循環執行正則表達式
Linux文本處理工具:
文本搜索 查找文件中符合特定條件的行shell
globbing: 通配符 元字符
*:p*dexpress
/etc/passwd: root編程
文本搜索工具:grep, egrep, fgrepbash
Global search REgular expression and Print out the line. 全局搜索正則表達式而且輸出工具
文本搜索工具,根據用戶指定的文本模式(搜索條件)對目標文件進行逐行搜索,顯示能匹配到的行。this
語法格式:
grep [option]... 'PATTERN' FILE...spa
--color=auto 指定匹配的模式用顏色來顯示
正則表達式:
是一類字符所書寫的模式,其中許多字符不表示其字面意義,而是表達控制或通配等功能;
元字符:不表示其字面意義,而用於額外功能性描述
正則表達式權威指南 書籍
正則表達式:正則表達式引擎(能理解正則表達式,是由程序自身實現的)
基本正則表達式:grep
擴展正則表達式: egrep, grep -E
fgrep: fast, 不支持使用正則表達式
基本正則表達式中的元字符:
字符匹配:
.: 匹配任意單個字符
[root@linux_basic ~]#alias grep='grep --color=auto'
[root@linux_basic ~]#grep "r..t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[]: 匹配指定範圍內的任意單個字符
[0-9], [[:digit:]]
[a-z], [[:lower:]]
[A-Z], [[:upper:]]
[[:space:]] 空格
[[:punct:]] 標點符號
[[:alpha:]] 全部字母
[[:alnum:]] 字母和數字
[^]:
次數匹配元字符:用於實現指定其前面的字符所可以出現的次數
*: 任意長度,它前面的字符能夠出現任意次
例如:x*y
xxy, xyy, y,
\?: 0次或1次,它前面的字符是無關緊要的
[root@linux_basic ~]#grep "r\?oot" /etc/passwd
例如:x\?y
xy, y, ay 不是整串,字串匹配也會顯示
\{m\}: m次,它前的字符要出現m次
[root@linux_basic ~]#grep "o\{2\}" /etc/passwd
例如:x\{2\}y
xy, xxy, y, xxxxy, xyy
\{m,n\}: 至少m次,至多n次
[root@linux_basic ~]#grep "o\{0,3\}" /etc/passwd
例如:x\{2,5\}y
xy, y, xxy
\{m,\}:至少m次
[root@linux_basic ~]#grep "o\{2\}" /etc/passwd
\{0,n\}: 至多n次
.*:任意長度的任意字符
[root@linux_basic ~]#grep "r.*t" /etc/passwd
工做於貪婪模式:儘量多的去匹配
位置錨定:
^: 行首錨定; 脫字符號
寫在模式最左側
$: 行尾錨定:
寫在模式最右側
^$: 空白行
不包含特殊字符的連續字符組成的串叫單詞:
\<: 詞首,出現於單詞左側,\b
\<char
[root@linux_basic ~]#grep "\<r..t" /etc/passwd
\>: 詞尾,出現於單詞右側, \b
char\>
[root@linux_basic ~]#grep "l..e\>" /etc/passwd
\< xxxxx\> 用來作精確錨定的 ?? ifconfig |grep -E "\<([0-9]|[1-9][0-9])\>" 左半邊和右半邊
ifconfig |grep -E "\<[0-9]|[1-9][0-9]\>"
[root@linux_basic ~]#grep "\<root\>" /etc/passwd
分組:
\(\)
例如:\(ab\)* 使用\來轉義的
分組中的模式匹配到的內容,可由正則表達式引擎記憶在內存中,以後可被引用
[root@linux_basic ~]#grep "\(root\)\{1\}" /etc/passwd
引用:
例如\(ab\(x\)y\).*\(mn\) 在嵌套的括號中,中間兩個最近的括號爲一組的
有編號:自左然後的左括號,以及與其匹配右括號
\(a\(b\(c\)\)mn\(x\)\).*\1
\#: 引用第n個括號所匹配到的內容,而非模式自己
例如:
\(ab\?c\).*\1 b出現0次或1次
abcmnaaa
abcmnabc
abcmnac
acxyac
grep命令選項:
-v: 反向選取
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX.)
-o: 僅顯示匹配的字串,而非字串所在的行
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on a separate
output line.
-i: ignore-case,忽略字符大小寫
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input files. (-i is specified by POSIX.)
-E: 支持使用擴展正則表達式
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see below). (-E is specified by
POSIX.)
-A # 匹配到對應的行及其下面#行
-A NUM, --after-context=NUM
Print NUM lines of trailing context after matching lines. Places a line containing a group
separator (--) between contiguous groups of matches. With the -o or --only-matching option,
this has no effect and a warning is given.
[root@linux_basic ~]#grep -A 1 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
-B # 匹配到對應的行及其上面#行
-B NUM, --before-context=NUM
Print NUM lines of leading context before matching lines. Places a line containing a group
separator (--) between contiguous groups of matches. With the -o or --only-matching option,
this has no effect and a warning is given.
[root@linux_basic ~]#grep -B 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
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
-C # 匹配到對應的行及其上下面#行
-C NUM, -NUM, --context=NUM
Print NUM lines of output context. Places a line containing a group separator (--) between
contiguous groups of matches. With the -o or --only-matching option, this has no effect and a
warning is given.
[root@linux_basic ~]#grep -C 2 "root" /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
--
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
練習:
一、顯示/proc/meminfo文件中以大寫或小寫S開頭的行;
# grep -i '^s' /proc/meminfo
# grep '^[Ss]' /proc/meminfo
# grep -E '^(S|s)' /proc/meminfo
二、顯示/etc/passwd文件中其默認shell爲非/sbin/nologin的用戶;
# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1
三、顯示/etc/passwd文件中其默認shell爲/bin/bash的用戶;
進一步:僅顯示上述結果中其ID號最大的用戶;
# grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n | tail -1 | cut -d: -f1
四、找出/etc/passwd文件中的一位數或兩位數;
# grep "\<[0-9][0-9]\?\>" /etc/passwd
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
五、顯示/boot/grub/grub.conf中以致少一個空白字符開頭的行;
# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
六、顯示/etc/rc.d/rc.sysinit文件中,以#開頭,後面跟至少一個空白字符,然後又有至少一個非空白字符的行;
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
七、找出netstat -tan命令執行結果中以'LISTEN'結尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
八、添加用戶bash, testbash, basher, nologin(SHELL爲/sbin/nologin),而找出當前系統上其用戶名和默認shell相同的用戶; # grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd