1. 程式人生 > 其它 >常用文字處理命令 & 三劍客之 sed

常用文字處理命令 & 三劍客之 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