本節會介紹:cut sort wc uniq tee tr split等文檔處理工具:shell
一、shell特殊符號:經常使用的符號以下:bash
*:表示零個或多個任意字符:工具
?:表示一個任意字符:code
#:表示註釋符號(shell腳本中經常使用):排序
\:表示脫義字符(特殊字符失去原本的含義):文檔
$:與!結合使用,「!$」表示上一條命令中的最後一個變量:字符串
; 分號,運行兩個或兩個以上的命令時使用:it
~ 用戶的家目錄(root的家目錄是/root/,普通用戶的家目錄是/home/username):io
& 用這個命令能夠某一條命令放在後臺去運行:test
[ ] 中括號爲一個字符的區間,表示中間的字符的任意有一個:
[root@localhost ~]# ls *.txt # 「*」 能夠匹配出任意個任意字符: 11.txt 222.txt 2.txt 3.txt [root@localhost ~]# ls ?.txt # 「?」 只能表示一個任意字符: 2.txt 3.txt [root@localhost ~]# c='$a$b' #用」單引號「也能夠脫義: [root@localhost ~]# echo $c $a$b [root@localhost ~]# c=\$a\$b #」斜槓「也可脫義,做用同上: [root@localhost ~]# echo $c $a$b
二、cut命令:用於截取字符串:
格式:cut -d '分隔符' [ -cf ]n #n是正整數:
-d:指定分隔符:分隔符要用單引號:(結合-f使用)
-f:後面接第幾個區塊:
-c:後面接第幾個字符:
[root@localhost ~]# cat /etc/passwd|cut -d ':' -f1 #-f要結合-d一塊兒使用: bin root
[root@localhost ~]# cat /etc/passwd|cut -c1|head -n2 r b
三、sort命令:用於排序:[ -n -r -u -kn1 -kn1,2 -t ]
格式:sort [-t '分隔符'] [options] [filename]
options:
-t:指定分隔符:通常結合-kn使用:
-n:使用純數字方式排序:(默認字母和數字爲0,會排序在前面,)
-r:逆向排序:
-kn1,n2:表示由n1到n2區間排序,若是隻寫kn1,表示只對n1字段排序:
sort不見任何選項,則從首字符開始,依次以ASCII碼值進行比較,最後按升序輸出:
[root@localhost ~]# cat 2.txt |sort #默認以ASCII碼排序: ^* , #$ 11111 2222 22222
-n和nr:純數字方式排序和逆向排序:
[root@localhost ~]# cat 2.txt |sort -n #以純數字方式排序,特殊字符默認都爲0: * #$ 2222 11111 22222 55555 [root@localhost ~]# cat 2.txt |sort -nr #也是是以純數字方式排序,不過期倒序顯示: 55555 22222 11111 2222 #$ *
四、wc命令:用於統計文檔的行數、字符數和詞數:
wc [ options ] filename
options:
-l:統計行數: list
-m:統計字符數: member
-w:統計詞數: word
[root@localhost ~]# cat 3.txt #編寫次文檔內容作實驗: 123 abc [root@localhost ~]# wc -l 3.txt #統計文檔的行數: 2 3.txt [root@localhost ~]# wc -w 3.txt #統計文檔的詞數:(單詞): 2 3.txt
[root@localhost ~]# wc -m 3.txt #統計當前文檔的字符數,發現明明是六個字符,卻顯示8個: 8 3.txt [root@localhost ~]# cat -A 3.txt #由於每行後面會有一個結束符‘$’: 123$ abc$
如上圖:使用 wc -m 統計字符數後,會發現文檔裏明明六個字符,統計時卻顯示八個字符,這是由於每行都會有一個結束符存在:
五、uniq 去重複:用於統計文檔中的重複的文字:
注:去重複以前須要先排序:通常須要結合sort使用,須要使用sort先排序:
uniq [ options ] filename
options:
-c:=count,在每列旁邊顯示該行重複的次數:
[root@localhost ~]# uniq -c 3.txt #首先直接去重複,發現不完整: 2 123 1 abc 1 def 1 456 1 123 1 456 [root@localhost ~]# sort -n 3.txt |uniq -c #再次排序後再去重複,發現能夠的: 1 abc 1 def 3 123 2 456
如上:咱們第一次使用uniq去重複的時候,發現文字裏仍是有重複;因此須要使用sort先排序再去重複:如圖例2:
六、tee:輸出重定向:重定向的同時,也會輸出顯示在屏幕上:
[root@localhost ~]# sort -n 2.txt |uniq -c |tee a.txt #查看文件內容並重定向到a.txt: 1 11111:222 2 22222 1 33333 1 44444 1 55555 [root@localhost ~]# cat 2.txt #查看文件內容: 11111:222 2222:111 33333 44444 22222 22222 55555 [root@localhost ~]#
-a:追加的命令:
[root@localhost ~]# sort -n 2.txt |uniq -c |tee -a a.txt #再次追加文件內容: 1 2222:111 1 11111:222 2 22222 1 33333 1 44444 1 55555 [root@localhost ~]# cat a.txt #查看文件內容,發現發生變化: 1 2222:111 1 11111:222 2 22222 1 33333 1 44444 1 55555 1 2222:111 1 11111:222 2 22222 1 33333 1 44444 1 55555
七、tr:替換字符:
[root@localhost ~]# cat 1.txt |head -n2|tr '[a-z]' '[A-Z]' #替換並再次查看文件內容: ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN [root@localhost ~]# cat 1.txt |head -n2|tr 'r' 'R' #替換單個字符並查看文件內容: Root:x:0:0:Root:/Root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin
八、split:切割文件內容: -b -l
split -b filename #按大小來切割文檔,默認單位爲byte:可自定義單位:
split -l filename #按行數來切割文檔:
[root@localhost test]# split -b 100 a.txt #按文件大小來劃分: [root@localhost test]# ls 1.txt a.txt xaa xab xac [root@localhost test]# split -b 100 a.txt tt #劃分時可自定義文件名稱: [root@localhost test]# ls 1.txt a.txt ttaa ttab ttac [root@localhost test]# split -l 7 a.txt #按行數來劃分: [root@localhost test]# ls 1.txt a.txt xaa xab xac xad
九、特殊字符: 「;」 「||」 「&&」
command1;command2 : 不論command1是否執行成功,都會執行command2:
command1 && command2 : 只有command1執行成功後,纔會執行command2:
command1 | | command2 : 表示command1執行成功後,command2不執行,不然執行 command2:
[root@localhost test]# touch 1.txt;ls 1.txt #表示都執行: 1.txt [root@localhost test]# ls 1.txt [root@localhost test]# ls 1.txt && mkdir dir #表示第一條命令成功,才執行第二條命令: 1.txt [root@localhost test]# ls 1.txt dir [root@localhost test]# ls a.txt && mkdir dir2 #當第一條命令失敗時,第二條也不執行: ls: cannot access a.txt: No such file or directory [root@localhost test]# ls 1.txt dir
[root@localhost test]# ls a.txt || mkdir dir2 #表示第一條命令失敗後,纔會執行第二條命令: ls: cannot access a.txt: No such file or directory [root@localhost test]# ls 1.txt dir dir2 [root@localhost test]# ls 1.txt || mkdir dir3 #第一條命令成功了,則不會執行第二條命令: 1.txt [root@localhost test]# ls 1.txt dir dir2