shell_03進階操作 文本的進階操作: wc -c-l-w diff --查看兩個檔案間不同地方,對比兩個檔案。 -b 忽略空格引起的不同 -i 忽略大小寫 -B 忽略插入空格引起的變化 sort --排序 -r 反向 -n 以數字來排序 -u 去除結果中的重複行 -t 指定分隔字元 -k 指字的列 -o 將輸出寫到指定的檔案,相當於將輸出重新導向到指定檔案 -c 測試檔案是否已經被排序 -m 合并兩個已排序的檔案 uniq --去除重複行 -c 統計重複的行數有幾行 -i 忽略大小寫 -d 只顯示重複的行 -u 只顯示沒有重複的記錄 cut --可以去除行間指定字元段 -d 指定分隔字元 -f 指定列 -c 字元的序號 c1-100 join命令用於實現兩個檔案中記錄的串連操作,串連操作將兩個檔案中具有相同域的記錄選擇出來,再將這些記錄所有的域放到一行(包含來自兩個檔案的所有域) -a1或-a2 除了顯示以共同域進行串連的結果外,-a1表示還顯示第1個檔案中沒有共同域的記錄,-a2則表示顯示第2個檔案中沒有共同域的記錄-i 比較域內容時,忽略大小寫差異-o 設定結果顯示的格式-t 改變域分隔字元-v1或-v2 跟-a選項類似,但是,不顯示以共同域進行串連的結果 paste --合并兩個檔案-d 預設域分隔字元是空格或Tab鍵,設定新的域分隔字元-s 將每個檔案粘貼成一行- 從標準輸入中讀取資料 # ls | paste -d" " - - - - - split 用於將大檔案切割成小檔案,split命令可以按照檔案的行數、位元組數切割檔案,並能在輸出的多個小檔案中自動加上編號 -或-l 此兩個選項等價,都用於指定切割成小檔案的行數-b 指定切割成小檔案的位元組-C 與-b選項類似,但是,切割時盡量維持每行的完整性# split -l50 /etc/passwd# split -b1000 /etc/passwd sb tr --替換,只能接受輸入重新導向的檔案流-d 冊除某個指定的字串-s 刪除所有重複出現的字元序列,只保留一個 # tr -s '[\n]' < AREACODE.db 將重複出現的分行符號壓縮成一個 BEIJING:86010HONGKONG:852SHANGHAI:86021TORONTO:001416#tr -d A-Z < AREACODE.db 刪除所有大寫字元#tr -d "[\n]" < AREACODE.db 刪除所有分行符號 \b 退格符 \r 斷行符號鍵 \t tab鍵# cat testWooooomennnnTTTTheyyyy#tr -s "[a-z],[A-Z]" < test 將所有重複字元壓縮成一個字元#tr -s "[a-z]" "[A-Z]" < test 將所有小寫換成大寫#tr "[o*5]" "@" < test 將檔案連續出現5次o字元改成@字元 # tr -d 'A-Z' < AREACODE.db | grep -v ^$ | tee dbn.out &> /dev/null && tr -d ':' < dbn.out # cut -d: -f2 AREACODE.db | grep -v '^$' tee --雙向重新導向 -a 追加# who | tee who.out Regex(regex) --用於文本精確匹配第一類Regex:(1).: 代表任意單個字元,除了分行符號(2)*: 前置字元出現 0 次 或 多次(3).*: 任意長度的字元(4)^: 行的開頭(5)$: 行的結尾(6)^$: 空行(7)[abc] 以字元為單位的或關係(8)[a-z] [A-Z] [0-9](9)[^abc] 取非(10)^[abc] a或b或c開頭的行(11)^[^abc] 非a或非b或非c開頭(12)\<: 取單詞的頭(13)\>: 取單詞的尾 --擴充類的Regex(14)+: 1次或多次(15)?: 0次或1次 (16)\<\> 精確匹配符號 (17)\{n\} 匹配前面字元出現n次 (18)\{n,\} 匹配前面字元至少出現n次 (19)\{n,m\} 匹配前面字元出現n次與m次之間 第二類Regex(POSIX標準):[[:digit:]]: 數字 [[:lower:]]: 小寫字母[[:upper:]]: 大寫字母[[:space:]]: 空格 [[:alnum:]]: 字母數字 支援Regex工具(軟體):grep/egrep find locate sed awk vim grep 'regex' file --把Regex寫在單引號中,防止shell解釋Regexgrep -E 'regex' file --匹配擴充的Regex在grep中需要加-E選項egrep=grep -E # find / -regex '.*\.iso$'# find / -regex '^\/var.*\.iso$' locate -r# locate -r '^\/var.*\.iso$' sed -n '/^root/p' /etc/passwd awk '/^root/ {print $0}' /etc/passwd vim/^root/nologin$:%s/^root/ROOT/g grep o:只列印匹配出來的字元n:顯示行號v:取反l:匹配成功,列印檔案c:統計匹配到的字元的數量,但是統計的是行數,而不是匹配的字元個數A:匹配行後幾行B:匹配行前幾行C:匹配行前後幾行, 如 -C 2 與 -2i:忽略大小寫q:靜默執行,一般在測試時,取傳回值用r/R:對一個目錄下的所有檔案進行搜尋--color:用特殊顏色標示匹配到的關鍵字H: 列出匹配到關鍵字的檔案路徑 egrep:拓展正則搜尋egrep = grep -E # cat grep.txt gglegoglegooglegoooglegaglegaaglegaaagleabcgef abcdef 操作如下:grep 'g.g' grep.txt --只要兩個g字母中間有一個任一字元就可以grep 'g*g' grep.txt --只要有一個g字母就可以。等同於grep g grep.txtgrep 'go*g' grep.txt --只要兩個g字母中間有零個o或多個o就可以 grep 'g.*g' grep.txt --只要兩個g字母中間有零個或任意個字元就可以grep 'go.*g' grep.txt --只要go與g字母中間有零個或任意個字元就可以 /etc/passwdgrep ^...t /etc/passwd --尋找每行裡第四個字元為t的行grep o.....$ /etc/passwd --尋找每行裡倒數第六個字元為o的行grep s..n /etc/passwd --尋找每行裡有s和n字元,並且中間有兩個字元的行grep x:4: /etc/passwd --尋找uid為4的行(只使用grep和Regex,不使用cut或awk的截取)grep .*:.:4:.*:.*:.*:.* /etc/passwd --尋找uid裡是4的行grep .*:.:.*4.*:.*:.*:.*:.* /etc/passwd --尋找uid裡包括4的行grep .*:.*:.*:.*::.*:.* /etc/passwd --尋找/etc/passwd裡注釋列為空白的行grep -v .*:.*:.*:.*::.*:.* /etc/passwd --尋找/etc/passwd裡注釋列不為空白的行grep .*:.*:.*:.*:..*:.*:.* /etc/passwdgrep .*:[!x].*:.*:.*:.*:.*:.*:.*:.* /etc/shadow --尋找不能在登入介面用密碼正常登入的使用者grep root /etc/passwd -- 過濾關鍵字grep '^root' /etc/passwd -- 以 root 開頭的行grep 'bash$' /etc/passwd -- 以 bash 結尾的行grep '^$' /etc/passwd -- 尋找空行grep '^[ru]' /etc/passwd -- r 或 ugrep '[0-9]' /etc/passwd -- 尋找數字grep '^[^abc]' /etc/passwd -- 取反,非 a 非 b 非 c 開頭grep '\<root\>' /etc/passwd -- \< 取單詞的頭,\> 取單詞的尾grep -E '^root|^zhang' /etc/passwd --color -- 拓展正則 , -E,匹配以root 或 zhang 開頭grep -n root /etc/passwd -- 帶行號過濾grep -oE '(([0-9]{1,3}\.){3}[--9]{1,3})' /var/log/secure--在文本過濾IP地址 grep [[:digit:]] /etc/passwd grep [[:lower:]] /etc/passwd grep [[:upper:]] /etc/passwd grep [[:space:]] /etc/passwd grep [[:alnum:]] /etc/passwd find find dir1 dir2... [options]...find /etc/ -maxdepth 1 : -- 最大深度find /etc/ -maxdepth 1 -type d|f|s|b|c|l : -- 最大深度 + 檔案類型find /etc/ -type f -name "passwd" -ls : -- find /etc/ -type f -user user01 -group group01: -- 按照使用者和所屬組搜尋find /etc/ -type f -perm 644 : -- 按照許可權進行搜尋find /etc/ -type f -perm +640: -- +號表示或關係find /etc/ -type f -perm -640: -- -號表示與關係 0代表忽略 +-號時代表空,find /bin -type f -perm +4000 -ls: -- 尋找帶有 suid 許可權的檔案find . -type f -size +5M -a -size -8M: -- 大於 5 M 小於 8M 的檔案find . -type f -size -5M -o -size +8M: -- 小於 5 M 大於 8M 的檔案find . -type f -size 1M -ok rm {} \; : -- 互動模式刪除find . -type f -size 1M -exec rm {} \; : -- 不互動模式刪除 正則:# cd /etc# find . -maxdepth 1 -regex '\./.*d$' # find . -maxdepth 1 -regex '\./h.*d$'# find . -maxdepth 1 -regex '\./.*[0-9].*' --尋找/etc目錄下的檔案名稱中包含有數位檔案 -type-name-size-perm-user -group-maxdepth N-mtime:-exec -ok -o -a -not-regex