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