linux--操作文本

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 預設僅會輸出第一個發現的不同點。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章