1、什麼是正則表達式
正則表達式是一類字符所書寫的模式(pattern)取行:選擇,grep,egrep,fgrep
使用正則表達式來描述選擇條件
正則表達式:基本正則表達式,擴展正則表達式
元字符:*,?這類字符不表示字符本身的意義,而用於額外功能性的描述
給定選取條件,只顯示符合條件的行
grep:默認支持基本正則表達式;
egerp:支持擴展正則表達式;
fgrep:不支持正則表達式元字符,快速搜索,所有的字符都當做字符本身
grep:簡單搜索,全局搜索基本正則表達式
grep [options] 'pattern' FILE
# grep 'root' /etc/passwd #顯示含有root字符串的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
基本正則表達式的元字符:
^:錨定行首的符合條件的內容,用法格式"^pattern"
# grep '^root' /etc/passwd root:x:0:0:root:/root:/bin/bash
$:錨定行尾的符合條件的內容,用法格式"pattern$"
# grep --color=auto 'sh$' /etc/passwd root:x:0:0:root:/root:/bin/bash oracle:x:500:500::/home/oracle:/bin/bash hadoop:x:501:502::/home/hadoop:/bin/bash
^pattern$:以單詞開頭,並以其結尾
^$:空白行
.:匹配任意單個字符
*:匹配緊挨在其前面的字符任意次數
a*b:ab,aab,acb,b
.*:匹配任意長度的任意字符
[]:匹配指定範圍內的任意但個字符
[^]:匹配指定範圍外的任意單個字符
\?:匹配緊挨在其前面的字符0次或1次
a\?b:ab,aab,acb,b
\{m,n\}:匹配其前面的字符至少m次,至多n次
a\{1,3\}b:b,ab,aab,aaaab,abc
\{0,n\}:至多n次,0-n次
\{m,\}:至少m次
\{m\}:精確匹配m次
\<:錨定詞首,,用法格式:\<pattern
\b:\bpattern
\>:錨定詞尾,用法格式:pattern\>
\b:pattern\b
\<pattern\>:錨定單詞
\(\):分組,用法格式:\(pattern\)
\(ab\)\{1,3\}:ab,aab,abb,abab,ababab
\(ab\).*\1:前面與後面一樣
# grep "\(gentoo\).*\1" /etc/passwd gentoo:x:1001:1001:cao yuan lang:/home/gentoo:/bin/bash
grep的選項:
--color=auto
export GREP_COLOR='01;36' 01表示字體顏色(前景色),36表示背景顏色
-v:反向選取,只顯示不符合模式的行
-o:只顯示被模式匹配到的字符串,而不是正行
-i:匹配時,不區分字符大小寫
-A N:顯示匹配到的行的時候,順帶顯示其後面的N個行
-B N:顯示匹配到的行的時候,順帶顯示其前面的N個行
-C N:顯示匹配到的行的時候,順帶顯示其前面和後面的N個行
-E:使用擴展的正則表達式
例:
顯示/proc/meminfo文件中以不區分大小的s開頭的行;
# grep "^[Ss]" /proc/meminfo
顯示/etc/passwd中以nologin結尾的行;
# grep "nologin$" /etc/passwd # grep "nologin$" /etc/passwd | wc -l #顯示有多少行
取出默認shell爲/sbin/nologin的用戶列表
# grep "nologin$" /etc/passwd | cut -d: -f1
取出默認shell的bash,且其用戶ID號最小的用戶名
# grep "/bin/bash$" /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1 #-t 指定分隔符,-k指定第幾個字段進行排序
顯示/etc/rc.d/rc.sysinit中以#開頭,且後面跟一個或多個空白字符,而後面又跟了任意非空白字符的行
# grep "^#[[:spaec:]]\{1,\}[^[:space:]]" /etc/rc.d/rc.sysinit
顯示/etc/rc.d/rc.sysinit中符合形爲“任意單個字符n任意字符任意單個字符n”模式的行:即任意但個字符後面跟了個n,n後面有任意長度的任意字符,而後是任意單個字符後面跟了個n
# grep ".n.*.n" /etc/rc.d/rc.sysinit
顯示/etc/rc.d/rc.sysinit中符合形爲“任意單個字符n任意字符任意單個字符n”模式的行:即任意單個字符後面跟了個n,n後面有任意長度的任意字符,而後是任意單個字符後面跟了個n,但後面的n之前的字符要與前面的n之前的字符相同
# grep "\(.n\).*\1" /etc/rc.d/rc.sysinit
顯示/boot/grub/grub.conf文件中以一個或多個空白字符開頭的行
# grep "^#[[:spaec:]]\{1,\}" /boot/grub/grub.conf
找出某文件中的,1位數,或2位數
# grep "\<[0-9]\{1,2\}\>" /etc/rc.d/rc.sysinit # grep -w "[0-9]\{1,2\}" /etc/rc.d/rc.sysinit
找出ifconfig命令結果中的1-255之間的整數
ifconfig | grep
# ifconfig | egerp --color=auto "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
100-199:1[0-9][0-9]
200-249:2[0-4][0-9]
250-255:25[0-5]
查找當前系統上名字爲student(必須出現在行首)的用戶的賬號的相關信息,文件爲/etc/passwd
# grep "^student:" /etc/passwd
擴展正則表達式元字符:
.:任意單個字符
[]:匹配指定範圍內的任意但個字符
[^]:匹配指定範圍外的任意單個字符
*:匹配緊挨在其前面的字符任意次數
+:匹配其前面的字符至少1次
?:匹配緊挨在其前面的字符0次或1次
{m,n}:至少m次,至多n次
():分組,支持引用\1,\2
a|b:二選一
\<:錨定詞首,,用法格式:\<pattern
\b:\bpattern
\>:錨定詞尾,用法格式:pattern\>
\b:pattern\b
\<pattern\>:錨定單詞
^:錨定行首的符合條件的內容,用法格式"^pattern"
$:錨定行尾的符合條件的內容,用法格式"pattern$"
# egrep "c|Cat" /root/test.txt c,Cat # egrep "(c|C)at" /root/test.txt cat,Cat
fgrep:fist
sort:排序
-f:忽略大小寫
-n:以數值大小進行排序:默認以ASCII表中的數字大小排序
-r:逆序排序
-u:移除重複的行,具有相同內容的行只保留一個
只有兩行一模一樣,並且挨着,纔算是重複的行
-R:隨機排序
-t:指定分隔符
-k:指定用第幾個字段進行排序
uniq:
-c:統計每行重複的
-u:只顯示沒有重複的行
-d:只顯示重複過的行
# sort sort.txt | uniq -c 1 First line. 1 Four line. 1 How are you? 2 Second line. 2 Third line. # sort sort.txt | uniq -d Second line. Third line. # sort sort.txt | uniq -u First line. Four line. How are you?
文本處理三劍客:grep,sed,awk
2、重定向
Linux I/O重定向,管道
I/O:這是一種統稱
Linux爲應用程序提供了I/O重定向的功能
程序本身要有輸入輸出的功能
爲了安全起見,所以輸入輸出都標準化了,標準輸入是鍵盤,標準輸出是監視器(顯示器),錯誤輸出也是監視器
每一個內核打開的文件都有一個文件描述符:file disciptor,FD
標準輸入FD:0 標準輸出FD:1 錯誤輸出FD:2
將其默認數據流改爲其他設備,就稱爲IO重定向
輸出重定向:
1>:覆蓋重定向,即覆蓋文件裏面的內容 1可以省略
set -C:避免覆蓋已經存在的文件的內容
set +C:關閉上述功能
1>>:追加重定向 1可以省略
/dev/null:數據黑洞,bit bucket
錯誤重定向:
2>:覆蓋重定向
2>>:追加重定向
">"改成">>"則表示把輸出追加到filename文件的末尾,如果文件不存在則創建它。
同時重定向標準輸出和錯誤輸出:
COMMAND > /path/to/stdout 2> /path/to/error
標準輸出和錯誤輸出定向至一個文件:
&>
&>>
COMMAND &> /path/to/somewhere 或 COMMAND > /path/to/somewhere 2>&1
輸入重定向:
<:
COMMAND < /from/somewhere
<<:Here Document,此處創建文檔
cat > /path/to/somefile << EOF 通常用於腳本中生成文檔
cat << EOF 通常用於腳本中向用戶輸出大段信息
3、管道
管道:|
COMMAND1 | COMMAND2 | COMMAND3 |...
管道的最後一個命令是在當前shell的子shell中執行
多道輸出:
tee
COMMAND1 | tee /path/to/somefile
# ifconfig | grep "inet addr:" | grep -v '127.0.0.1' | cut -d:-f2 | cut -d' ' -f1 192.168.1.1
例:
統計/usr/bin/目錄下的文件個數
# ls /usr/bin | wc -l
取出當前系統上所有用戶的shell,要求每種shell只顯示一次,並且按順序進行顯示
# cut -d: -f7 /etc/passwd | sort -u | grep -v "^$"
如何顯示/var/log目錄下每個文件的內容類型?
# file /var/log/* 或 # cd /var/log ; file 'ls /var/log'
取出/etc/inittab文件的第5行
# head -5 /etc/inittab | tail -1
取出etc/passwd文件中倒數第9個用戶的用戶名和shell,顯示到屏幕上並將其保存至/tmp/users.txt文件中
# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users.txt
顯示/etc目錄下所有以pa開頭的文件,並統計其個數
# ls /etc/pa* | wc -l
不使用文件編輯器,將alias cle=clear一行內容添加至當前用戶的.bashrc文尾部
# echo 'alias cls=clear' >> ~/.bashrc