歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> shell_03高級操作

shell_03高級操作

日期:2017/3/1 16:15:23   编辑:SHELL編程
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:86010 HONGKONG:852 SHANGHAI:86021 TORONTO:001416 #tr -d A-Z < AREACODE.db 刪除所有大寫字符 #tr -d "[\n]" < AREACODE.db 刪除所有換行符 \b 退格符 \r 回車鍵 \t tab鍵 # cat test Wooooomennnn TTTTheyyyy #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) --用於文本精確匹配 第一類正則表達式: (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)\>: 取單詞的尾 --擴展類的正則表達式 (14)+: 1次或多次 (15)?: 0次或1次 (16)\<\> 精確匹配符號 (17)\{n\} 匹配前面字符出現n次 (18)\{n,\} 匹配前面字符至少出現n次 (19)\{n,m\} 匹配前面字符出現n次與m次之間 第二類正則表達式(POSIX標准): [[:digit:]]: 數字 [[:lower:]]: 小寫字母 [[:upper:]]: 大寫字母 [[:space:]]: 空格 [[:alnum:]]: 字母數字 支持正則表達式工具(軟件): grep/egrep find locate sed awk vim grep 'regex' file --把正則表達式寫在單引號中,防止shell解釋正則表達式 grep -E 'regex' file --匹配擴展的正則表達式在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 與 -2 i:忽略大小寫 q:靜默執行,一般在測試時,取返回值用 r/R:對一個目錄下的所有文件進行搜索 --color:用特殊顏色標示匹配到的關鍵字 H: 列出匹配到關鍵字的文件路徑 egrep:拓展正則搜索 egrep = grep -E # cat grep.txt ggle gogle google gooogle gagle gaagle gaaagle abcgef abcdef 操作如下: grep 'g.g' grep.txt --只要兩個g字母中間有一個任意字符就可以 grep 'g*g' grep.txt --只要有一個g字母就可以。等同於grep g grep.txt grep 'go*g' grep.txt --只要兩個g字母中間有零個o或多個o就可以 grep 'g.*g' grep.txt --只要兩個g字母中間有零個或任意個字符就可以 grep 'go.*g' grep.txt --只要go與g字母中間有零個或任意個字符就可以 /etc/passwd grep ^...t /etc/passwd --查找每行裡第四個字符為t的行 grep o.....$ /etc/passwd --查找每行裡倒數第六個字符為o的行 grep s..n /etc/passwd --查找每行裡有s和n字符,並且中間有兩個字符的行 grep x:4: /etc/passwd --查找uid為4的行(只使用grep和正則表達式,不使用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/passwd grep .*:[!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 或 u grep '[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
Copyright © Linux教程網 All Rights Reserved