文章目錄
shell中的特殊字符
字符 | 內容 |
---|---|
* | 代表0個或多個字符 |
? | 代表一定有一個字母 |
# | 註釋 |
\ | 轉義字符,將特殊字符變成一般字符 |
| | 管道符 |
; | 連續的命令 |
~ | 使用者的家目錄 |
$ | 取變量值的前綴 |
& | 將指令變成背景下的工作 |
! | 邏輯上的非 |
/ | 路徑分隔 |
>,>> | 輸出導向,分別爲覆蓋和追加 |
’ | 單引號,不會置換變量 |
" | 雙引號,具有變量置換 |
` ` | 先執行其中的指令 |
( ) | 中間爲子程序的代碼 |
[ ] | 中間爲字符的組合 |
{ } | 中間爲命令區塊的組合 |
正則表達式
基本正則
正則表達式 | 說明 |
---|---|
^ | 行首 |
$ | 行尾 |
. | 匹配任意一個字符 |
[] | 匹配包含在[字符]之中的任意一個字符 |
[^] | 匹配除[^字符]之外的任意一個字符 |
[-] | 匹配[]中指定範圍內的任意一個字符 |
? | 匹配項1次或0次 |
+ | 匹配1次或多次 |
* | 匹配0次或多次 |
() | 創建一個用於匹配的子串 |
{n} | 匹配之前的項n次 |
{n,} | 之前的項至少匹配n次 |
{n,m} | 指定之前的項所必須匹配的最小次數和最大次數 |
| | 交替–匹配|兩邊的任意一項 |
\ | 轉義字符 |
POSIX字符類
形如[:…:]的特殊元序列,可以匹配特定的字符範圍
正則表達式 | 描述 |
---|---|
[:alnum:] | 字母與數字字符 |
[:alpha:] | 字母字符 |
[:blank:] | 空格與製表符 |
[:digit:] | 數字字符 |
[:lower:] | 小寫字母 |
[:upper:] | 大寫字母 |
[:punct:] | 標點符號 |
[:space:] | 包括換行符、回車等在內的所有空白字符 |
元字符
元字符是Perl風格的正則表達式,只有一部分文本處理工具支持它
正則表達式 | 描述 |
---|---|
\b | 單詞邊界 |
\B | 非單詞邊界 |
\d | 單個數字字符 |
\D | 單個非數字字符 |
\w | 單個單詞字符(字母、數字與_) |
\W | 單個非單詞字符 |
\n | 換行符 |
\s | 單個空白字符 |
\S | 單個非空白字符 |
\r | 回車 |
操作文本的程序
grep:行搜索器
在文件中搜索文本,行搜索器
[root@linux ~]# grep [-acinv] '搜尋字符串' filename
參數:
-a,將 binary 檔案以 text 檔案的方式搜尋數據
-E,PATTERN使用正則表達式,也可直接使用egrep
-o,只顯示匹配到的文本部分
-v,打印除匹配行以外的所有行
-c,打印匹配行的數量
-n,打印匹配行的行號
-b,打印匹配字符所在行的偏移字符或字節(和-o配合使用)
-l,搜索多個文件,顯示匹配文本的文件名
-L,與-l相反
-R,遞歸搜索文件
-i,忽略樣式中的大小寫
--include,包含某文件
--exclude,排除某文件
--exclude-dir,排除目錄
--exclude-from FILE
-q,靜默模式,命令運行成功返回0
-A #,打印匹配文本之後的#行
-B #,打印匹配文本之前的#行
-C #,打印匹配文本之前以及之後的#行
實例:
#顯示匹配的行內容
[root@localhost gpadmin]# grep gpadmin /etc/passwd
gpadmin:x:530:530::/home/gpadmin:/bin/bash
#顯示匹配的內容
[root@localhost gpadmin]# grep -o gpadmin /etc/passwd
gpadmin
gpadmin
#顯示匹配的內容及其行號
[root@localhost gpadmin]# grep -on gpadmin /etc/passwd
34:gpadmin
34:gpadmin
#顯示匹配到該字符的文件名
[root@localhost gpadmin]# grep -l gpadmin /etc/passwd /etc/shadow
/etc/passwd
/etc/shadow
#顯示出沒有匹配到該字符的文件
[root@localhost gpadmin]# grep -L gpadmin /etc/passwd /etc/shadow /etc/init
/etc/init.conf
#顯示目錄下匹配到的文件名
[root@localhost gpadmin]# grep -rl gpadmin /etc/
/etc/gshadow
/etc/passwd
/etc/group
/etc/shadow
#排除/etc/group文件
[root@localhost gpadmin]# grep --exclude=*group -rl gpadmin /etc/
/etc/gshadow
/etc/passwd
/etc/shadow
cut:按列操作
按列切分文件
:
[root@linux ~]# cut -d'分隔字符' -f fields [file or stdin]
[root@linux ~]# cut -c 字符區間 [file or stdin]
參數:
-b,指定截取的字節數
-c,指定截取的字符數
-d,指定截取的分隔符
-f,指定截取的列
截取的範圍:
N:截取第N列(字節,字符)
N-:截取從第N列(字節,字符)之後的列(字節,字符)
N-M:截取第N列(字節,字符)到M列(字節,字符)
N,M:截取第N,M列(字節,字符)
--output-delimiter,指定輸出的分隔符
實例:
#以冒號爲分隔符,取第1和3列的內容,修改輸出分隔符
[root@localhost gpadmin]# echo $PATH | cut -d":" -f1,3 --output-delimiter=" | "
/usr/local/greenplum-db/./bin | /usr/local/greenplum-db/./bin
#以冒號爲分隔符,取第1到3列的內容,修改輸出分隔符
[root@localhost gpadmin]# echo $PATH | cut -d":" -f1-3 --output-delimiter=" | "
/usr/local/greenplum-db/./bin | /usr/local/greenplum-db/./ext/python/bin | /usr/local/greenplum-db/./bin
#輸出第12位到20位字符
[root@localhost gpadmin]# echo $PATH | cut -c 12-20
greenplum
sort:排序
以行爲單位,進行排序等操作。
[root@linux ~]# sort [-fbMnrtuk] [file or stdin]
參數:
-f :忽略大小寫的差異
-b :忽略最前面的空格符部分
-M :以月份的名字來排序,例如 JAN, DEC 等等的排序方法
-n :使用純數字進行排序
-r :反向排序
-u :去除重複
-t :分隔符,默認是 tab 鍵
-k :以那個區間 (field) 來進行排序
實例:
#通過冒號分隔,以第三個分隔進行排序
#默認以字符串的形式進行排序
[root@localhost tmp]# head /etc/passwd | sort -t':' -k3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
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
#通過數字形式來排序
[root@localhost tmp]# head /etc/passwd | sort -t':' -k3 -n
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
uniq:去重
[root@linux ~]# uniq [-ic]
參數:
-i :忽略大小寫字符的不同
-c :進行計數
#取出賬號名排序並去重
[root@localhost tmp]# last | cut -d ' ' -f1 |sort |uniq
gpadmin
reboot
root
wtmp
#取出賬號並計算出每個用戶的登入總次數
[root@localhost tmp]# last | cut -d ' ' -f1 |sort |uniq -c
1
24 gpadmin
6 reboot
9 root
1 wtmp
wc:計數
[root@linux ~]# wc [-lwm]
參數:
-l :僅列出行
-w :僅列出多少字
-m :多少字符
實例:
#last中有少行、字數、字符數
[root@localhost tmp]# last | wc
41 402 3041
行 字數 字符數
#去除包含pgadmin的行的總數
[root@localhost tmp]# last | grep [a-zA-Z]|grep -v 'gpadmin' |wc -l
16
tee:雙向重導向
[root@linux ~]# tee [-a] file
參數:
-a :以累加 (append) 的方式,將數據加入 file 當中
#將 last 的輸出存一份到 last.list 文件中
[root@linux ~]# last | tee last.list | cut -d " " -f1
# 將 ls 的數據存一份到 ~/homefile ,同時輸出到屏幕
[root@linux ~]# ls -l /home | tee ~/homefile | more
#在文件中追加
[root@linux ~]# ls -l / | tee -a ~/homefile | more
tr:刪除或替換文本
[root@linux ~]# tr [-ds] SET1 ...
參數:
-d :刪除訊息當中的 SET1 這個字符串
-s :取代掉重複的字符
#將 last 輸出的訊息中,所有的小寫變成大寫字符:
[root@linux ~]# last | tr '[a-z]' '[A-Z]'
#將 /etc/passwd 輸出的訊息中,將冒號刪除
[root@linux ~]# cat /etc/passwd | tr -d ':'
join:整合文件
join比對兩個文件,將相同行拼接在一起。
[root@linux ~]# join [-ti12] file1 file2
參數:
-t :join 默認以空格符分隔數據,並且比對第一個字段的數據,
如果兩個文件相同,則將數據聯成一行,且第一個字段放在第一個
-i :忽略大小寫的差異
-1 :這個是數字的 1 ,代表第一個檔案要用那個字段來分析的意思
-2 :代表第二個檔案要用那個字段來分析的意思
實例:
#將 /etc/passwd 與 /etc/shadow 相關數據整合成一欄
[root@localhost tmp]# join -t ':' /etc/passwd /etc/shadow | head -n5
root:x:0:0:root:/root:/bin/bash:$6$WzF.cG7e8CjwRriy$ZlKhnum/naKODOBvk1laxIijrHN.Hxf421B6G9.pCeS5ASemP105y8R1dripeAA9o.JN4o6tWwdJrTS.qfFku1:17830:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:15980:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:15980:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin:*:15980:0:99999:7:::
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin:*:15980:0:99999:7:::
#/etc/passwd 第四個字段是 GID ,那個 GID 記錄在/etc/group 當中的第三個字段,將這兩個文件進行整合
[root@localhost tmp]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group | head -n5
0:root:x:0:root:/root:/bin/bash:root:x:
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:bin,daemon
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:bin,daemon
4:adm:x:3:adm:/var/adm:/sbin/nologin:adm:x:adm,daemon
7:lp:x:4:lp:/var/spool/lpd:/sbin/nologin:lp:x:daemon
paste:合併文件
paste直接將兩個文本拼接在一起,中間以tab鍵來分隔。
[root@linux ~]# paste [-d] file1 file2
參數:
-d :後面可以接分隔字符。默認是以 [tab] 來分隔的
- :如果 file 部分寫成 - ,表示來自 standard input
實例:
#將 /etc/passwd 與 /etc/shadow 同一行貼在一起,中間以tab爲分隔符
[root@localhost tmp]# paste /etc/passwd /etc/shadow | head -n 5
root:x:0:0:root:/root:/bin/bash root:$6$WzF.cG7e8CjwRriy$ZlKhnum/naKODOBvk1laxIijrHN.Hxf421B6G9.pCeS5ASemP105y8R1dripeAA9o.JN4o6tWwdJrTS.qfFku1:17830:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin bin:*:15980:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:15980:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin adm:*:15980:0:99999:7:::
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin lp:*:15980:0:99999:7:::
split:分割
[root@linux ~]# split [-bl] file PREFIX
參數:
-b :後面可接欲分割成的文件大小,可加單位,例如 b, k, m 等
-l :以行數來進行分割
實例:
# /etc/termcap 有七百多 K,若想要分成 300K 一個檔案時
[root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap
[root@linux tmp]# ls -l termcap*
-rw-rw-r-- 1 root root 307200 8 月 17 00:25 termcapaa
-rw-rw-r-- 1 root root 307200 8 月 17 00:25 termcapab
-rw-rw-r-- 1 root root 184848 8 月 17 00:25 termcapac
xargs:參數代換
[root@linux ~]# xargs [-0epn] command
參數:
-0 :如果輸入的 stdin 含有特殊字符,例如 `, \, 空格鍵等等字符時,這個 -0 參數
可以將他還原成一般字符。
-e :這個是 EOF (end of file) 的意思。後面可以接一個字符串,當 xargs 分析到這個字符串時,就會停止繼續工作
-p :在執行每個指令的 argument 時,都會詢問使用者的意思
-n :後面接次數,每次 command 指令執行時,要使用幾個參數的意思
diff:比對文件
diff 就是用在比對兩個檔案之間的差異的,一般是用在 ASCII 純文字文件的比對上
[root@linux ~]# diff [-bBi] from-file to-file
參數:
from-file :源文件名
to-file :對比文件名
注意,from-file 或 to-file 可以 - 取代,那個 - 代表『Standard input』之意。
-b :忽略一行當中,僅有多個空白的差異
-B :忽略空白行的差異
-i :忽略大小寫的不同
cmp:比對文件
diff以行爲單位比對,cmp以位爲單位比對
[root@linux ~]# cmp [-s] file1 file2
參數:
-s :將所有的不同點的位處都列出來。因爲 cmp 預設僅會輸出第一個發現的不同點。