常用文字處理命令 & 三劍客之 sed
今日內容
- 文字處理命令
- Linux 三劍客之 sed
內容詳細
文字處理命令
1、sort : 檔案內容排序
預設按照檔案隔行內容的第一個字元大小進行排序(預設是升序)
預設輸出文字結果
sort [引數] [操作物件]
[root@localhost tmp]# sort test
232
34
454
455
[root@localhost tmp]# sort test2
a
A
aa
AA
Ab
ba
Bb
# 如果是英文字元,則是按照 ascii 表的大小比較,且同字母的大小寫會先進行比較,字母相同的位數會先比。
引數:
-n 依照數值的大小排序
[root@localhost tmp]# sort -n test 34 89 89 232 454 # 按照數值的大小比較
-r 以相反的順序來排序
[root@localhost tmp]# sort -r test
909
89
89
677
# 與 n 比較數字大小配合使用
[root@localhost tmp]# sort -rn test
909
677
576
455
455
454
232
89
-k 以某列進行排序
# 以第二列第一個數字的大小進行升序排序 [root@localhost tmp]# sort -k2 test 909 235 576 4323 34 454 455 4667 # 與 n、r 配合使用,用數值大小進行倒序(降序)進行排序 [root@localhost tmp]# sort -k2nr test 454 97867 89 7887 232 6578 89 5456
-t 指定分割符,預設是以空格為分隔符
預設不能用 tab 符來分隔,先進行轉義 : -t$'\t'
[root@localhost tmp]# sort -t$'\t' test
232 6578
34 454
454 97867
455 4667
2、uniq :檢查和刪除文字中重複出現的行列
用於檢查和刪除文字中重複出現的行列,注意,只有相鄰並且重複的內容才會被識別出來,一般與 sort 命令結合使用
uniq [引數] [被操作物件] [root@localhost tmp]# cat test3 456 456 867 867 867 456 456 9877 9877 [root@localhost tmp]# uniq test3 456 867 456 9877 # 由此可見:只有相鄰並且重複的內容才會被識別出來, # 解決 : 與 sort 命令結合使用,先排序才去重
引數:
-c : 每列旁邊顯示該行重複出現的次數
sort -nr test3 | uniq -c
先用 sort 進行數值降序排序,再進行去重並統計每行重複次數
[root@localhost tmp]# sort -nr test3 | uniq -c
3 9877
4 867
6 456
-d : 僅顯示重複出現的行列
sort -nr test3 | uniq -d
先進行排序,再顯示重複出行的行列
[root@localhost tmp]# sort -nr test3 | uniq -d
9877
867
456
-u : 僅顯示出現一次的行列
uniq -u test3
[root@localhost tmp]# uniq -u test3
abcde
fghij
3、cut 顯示行中指定部分,刪除檔案指定欄位
cut命令可以從一個文字檔案或者文字流中提取文字列
(切割必須指定位元組、字元或欄位的列表)
cut -f list [-d delim][-s] [file ...]
[root@localhost ~]# cut -f1 -d':' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
# passwd 使用者資訊檔案內容以 : 為分隔符分隔為多列,順利地
引數:
-d :指定欄位的分隔符,預設的欄位分隔符為"TAB"
cut -d':' /etc/passwd
將 passwd 中的內容以冒號 ':' 為分割符分割成好幾列
-f : 顯示指定欄位的內容
cut -f1 /etc/passwd
取出 passwd 中分列之後的第一個欄位的所有內容
4、tr : 替換或刪除命令
可以將 tr 看作為 sed的(極其)簡化的變體:
它可以用一個字元來替換另一個字元
可以完全除去一些字元
也可以用它來除去重複字元
替換字元
[root@localhost tmp]# cat test3
456
456
456
867
867
# 把 456 替換成 son
注意:替換是一個一個字元相對位置替換的,也就是 s 替換了 4, o 替換了 5, n 替換了 6
[root@localhost tmp]# cat test3 | tr '456' 'son'
son
son
son
8n7
8n7
-d : 刪除字元
cat test3 | tr -d '123'
[root@localhost tmp]# cat test3 | tr -d '456'
87
87
# 成功刪除 456
5、wc : 統計,計算數字
預設會統計檔案的 行數(l)、單詞個數(w)、檔案大小(c)
[root@localhost tmp]# wc test3
15 17 75 test3
行數 單詞數 檔案大小
-l : 統計檔案的行數
[root@localhost tmp]# wc -l test3
15 test3
-w : 統計檔案中單詞的個數,預設以空白字元做為分隔符
[root@localhost tmp]# wc -w test3
17 test3
-c : 統計檔案的Bytes數
[root@localhost tmp]# wc -c test3
75 test3
Linux 三劍客之 sed
三劍客:
grep : 過濾檔案
sed : 更改檔案
awk : 處理檔案
sed是linux中的流媒體編輯器
1、語法格式
sed [引數] '處理規則' [操作物件]
2、引數
-e : 允許多項編輯
-n : 取消預設輸出
-i : 就地編輯
-r : 支援拓展正則
-f : 指定 sed 匹配規則指令碼檔案
3、定位
d : sed的編輯模式 --> 刪除
p : 列印
1、數字定位法
[root@localhost tmp]# cat -n test3
1 456
2 456
3 456
4 456
5 867
6 867
# 定位檔案的第三行,刪除 d
[root@localhost tmp]# cat -n test3 | sed '3d'
1 456
2 456 < -- 第三行被刪除了
4 456
5 867
6 867
# 定位到內容第二和第四行,會刪除內容的 3到4 行
[root@localhost tmp]# cat -n test3 | sed '2,4d'
1 456 < -- 第 2 到 第 4 行被刪除了
5 867
6 867
2、正則定位法
把正則表示式寫在 引號的 / / 內
[root@localhost tmp]# cat test3
456
456
867
867
# 刪除以四開頭的內容
[root@localhost tmp]# sed '/^4/d' test3
867
867
3、數字和正則定位法
[root@localhost tmp]# cat test3
456
456
456
456
867
867
# 刪除第 2 行到 以 8 開頭的內容
[root@localhost tmp]# sed '2,/^8/d' test3
456
867
4、正則正則定位法
[root@localhost tmp]# cat test3
456
456
456
867
867
867
867
456
# 把以 8 開頭 到以 4 開頭 的內容刪除
[root@localhost tmp]# sed '/^8/,/^4/d' test3
456
456
456
456
4、sed 的編輯模式:
d : 刪除
[root@localhost tmp]# cat -n test3
1 456
2 456
3 456
4 456
5 867
6 867
# 定位檔案的第三行,刪除 d
[root@localhost tmp]# cat -n test3 | sed '3d'
1 456
2 456 < -- 第三行被刪除了
4 456
5 867
6 867
p : 列印
a : 在當前行後新增一行或多行
# 在文字的第二行之後新增 內容
[root@localhost tmp]# cat -n test3 | sed '2alixiaoze i am sorry'
1 456
2 456
lixiaoze i am sorry
3 456
4 456
c : 用新文字修改(替換)當前行
# 把文字第二行內容替換成 c 後面的內容
[root@localhost tmp]# cat -n test3 | sed '2cxiaoze wo cuo le'
1 456
xiaoze wo cuo le
3 456
4 456
5 867
r : 在檔案中讀內容
# 1.txt 中的內容:
[root@localhost tmp]# cat 1.txt
xiaoze qing yuanliang
# forgive 中的內容:
[root@localhost tmp]# cat forgive
heihei
eat tanyuan
wo
# 把 1.txt 中所有內容讀取到 forgive 檔案內容的第二行下方
[root@localhost tmp]# sed '2r 1.txt' forgive
heihei
eat tanyuan
xiaoze qing yuanliang
wo
w : 將指定行寫入檔案
# 把 1.txt 中的第三行內容寫入到 forgive 檔案中去
[root@localhost tmp]# sed '3w forgive' 1.txt
[root@localhost tmp]# cat forgive
wo
y : 將字元轉換成另一個字元
# 將 1.txt 檔案第三行中的 wo 轉換成 WO
[root@localhost tmp]# sed '3y/wo/WO/' 1.txt
heihei
eat tanyuan
WO
wo
i : 在當前行之前,插入文字(單獨使用時)
# 在第二行之前,插入內容
[root@localhost tmp]# cat -n test3 | sed '2ixiaoze forgive me please~~'
1 456
xiaoze forgive me please~~
2 456
3 456
4 456
i : 忽略大小寫(與s模式一起使用時)
# 把 1.txt 檔案內容中全部字元 wo 轉換成 HE, 全部執行,忽略大小寫
[root@localhost tmp]# sed 's/wo/HEE/gi' 1.txt
heihei
eat tanyuan
HEEHEEHEE
HEEHEEHEEHEE
s : 將字串轉換成另一個字串(每一行只替換一次)
[root@localhost tmp]# cat 1.txt
heihei
eat tanyuan
wowowo
wowowowo
# 把 1.txt 檔案內容中每一行的第一個字元 wo 轉換成 HE
sed 's/wo/HEE/' 1.txt
[root@localhost tmp]# sed 's/wo/HEE/' 1.txt
heihei
eat tanyuan
HEEwowo
HEEwowowo
g : 全部執行(一般配合 s 使用)
# 把 1.txt 檔案內容中全部字元 wo 轉換成 HE, 全部執行
[root@localhost tmp]# sed 's/wo/HEE/g' 1.txt
heihei
eat tanyuan
HEEHEEHEE
HEEHEEHEEHEE