shell學習5.sed和awk

文本處理三劍客

 

在 Shell 下使用這些正則表達式處理文本最多的命令有下面幾個工具:linux

                命令                描述
grep 默認不支持擴展表達式,加-E 選項開啓 ERE。若是不加-E 使用花括號要加轉義符\{\}
egrep 支持基礎和擴展表達式
awk 支持 egrep 全部的正則表達式
sed 默認不支持擴展表達式,加-r 選項開啓 ERE。若是不加-r 使用花括號要加轉義符\{\}

 

 

sed詳解

 

1. 前言

 

  • 咱們都知道,在Linux中一切皆文件,好比配置文件,日誌文件,啓動文件等等。若是咱們相對這些文件進行一些編輯查詢等操做時,咱們可能會想到一些vi,vim,cat,more等命令。可是這些命令效率不高,而在linux中有三種工具:頂配awk,中配sed,標配grep。使用這些工具,咱們可以在達到一樣效果的前提下節省大量的重複性工做,提升效率。
  • 文件內容能夠是來自文件,也能夠直接來自鍵盤或者管道等標準輸入,最後的結果默認狀況下是顯示到終端的屏幕上,可是也能夠輸出到文件中。
  • 編輯文件也是這樣,之前咱們修改一個配置文件,須要移動光標到某一行,而後添加點文字,而後又移動光標到另外一行,註釋點東西…….可能修改一個配置文件下來須要花費數十分鐘,還有可能改錯了配置文件,又得返工。這仍是一個配置文件,若是數十個數百個呢?所以當你學會了sed命令,你會發現利用它處理文件中的一系列修改是頗有用的。只要想到在大約100多個文件中,處理20個不一樣的編輯操做能夠在幾分鐘以內完成,你就會知道sed的強大了。

 

2. 語法格式

 

sed [選項]  [sed命令]  [輸入文件]正則表達式

說明:shell

1,注意sed軟件以及後面選項,sed命令和輸入文件,每一個元素之間都至少有一個空格。編程

2,sed -commands(sed命令)是sed軟件內置的一些命令選項,爲了和前面的options(選項)區分,故稱爲sed命令vim

3,sed -commands 既能夠是單個sed命令,也能夠是多個sed命令組合。數組

4,input -file (輸入文件)是可選項,sed還可以從標準輸入如管道獲取輸入。緩存

 

3. sed的工做原理

 

sed讀取一行,首先將這行放入到緩存中bash

而後,纔對這行進行處理app

處理完成之後,將緩衝區的內容發送到終端編程語言

存儲sed讀取到的內容的緩存區空間稱之爲:模式空間(Pattern Space)

 

4. 選項說明

 

option[選項] 解釋說明(帶*的爲重點)
-n (no) 取消默認的sed軟件的輸出,常與sed命令的p連用。*
-e (entry) 一行命令語句能夠執行多條sed命令   *
-r (ruguler) 使用擴展正則表達式,默認狀況sed只識別基本正則表達式  *
-i (inside) 直接修改文件內容,而不是輸出到終端,若是不使用-i選項sed軟件只是修改在內存中的數據,並不會影響磁盤上的文件*

 

sed -commands[sed命令] 解釋說明(帶*的爲重點)
a (append) 追加,在指定行後添加一行或多行文本 *                                                      
c (change) 取代指定的行
d (delete) 刪除指定的行  *  
i (insert) 插入,在指定行前添加一行或多行文本 *
p (print) 打印模式空間內容,一般p會與選項-n一塊兒使用*
特殊符號 解釋說明(帶*的爲重點)
對指定行之外的全部行應用命令* 

 

awk詳解

 

awk不只僅時linux系統中的一個命令,並且是一種編程語言,能夠用來處理數據和生成報告(excel)。處理的數據能夠是一個或多個文件,能夠是來自標準輸入,也能夠經過管道獲取標準輸入,awk能夠在命令行上直接編輯命令進行操做,也能夠編寫成awk程序來進行更爲複雜的運用。

 

awk的格式

 

  • awk指令是由模式,動做,或者模式和動做的組合組成。
  • 模式既pattern,能夠相似理解成sed的模式匹配,能夠由表達式組成,也能夠是兩個正斜槓之間的正則表達式。好比NR==1,這就是模式,能夠把他理解爲一個條件。
  • 動做即action,是由在大括號裏面的一條或多條語句組成,語句之間使用分號隔開。好比awk使用格式:

 

awk處理的內容能夠來自標準輸入(<),一個或多個文本文件或管道。

    • pattern既模式,也能夠理解爲條件,也叫找誰,你找誰?高矮,胖瘦,男女?都是條件,既模式。
    • action既動做,能夠理解爲幹啥,找到人以後你要作什麼。
      模式和動做的詳細介紹咱們放在後面部分,如今你們先對awk結構有一個瞭解。

 

awk參數

 

-F:指定分隔符

 

幾個小概念

 

記錄(record):一行就是一個記錄

分隔符(field separator):進行對記錄進行切割的時候所使用的字符

字段(field):將一條記錄分割成的每一段

FILENAME:當前處理文件的文件名

FS(Field Separator):字段分隔符(默認是以空格爲分隔符=)

NR(Number of Rrecord):記錄的編號(awk每讀取一行,NR就加1==)

NF(Number of Field):字段數量(記錄了當前這條記錄包含多少個字段==)

ORS(Output Record Separator):指定輸出記錄分隔符(指定在輸出結果中記錄末尾是什麼,默認是\n,也就是換行)

OFS(Output Field Separator):輸出字段分隔符

RS:記錄分隔符

 

輸出字段的表示方式

 

$1 $2 … $n 輸出一個指定的字段

$NF 輸出最後一個字段

$0 輸出整條記錄

awk進階–正則

 

正則表達式的運用,默認是在行內查找匹配的字符串,如有匹配則執行action操做,可是有時候僅須要固定的列來匹配指定的正則表達式,好比:我想取/etc/passwd文件中第五列{$5}這一列查找匹配mail字符串的行,這樣就須要用另外兩個匹配操做符,而且awk裏面只有這兩個操做符來匹配正則表達式。

awk特殊模式-BEGIN模式與END模式

 

BEGIN模塊再awk讀取文件以前就執行,通常用來定義咱們的內置變量(預約義變量,eg:FS,RS)

須要注意的是BEGIN模式後面要接跟一個action操做塊,包含在大括號內。awk必須在輸入文件進行任何處理前先執行BEGIN裏的動做(action)。咱們能夠不要任何輸入文件,就能夠對BEGIN模塊進行測試,由於awk須要先執行完BEGIN模式,纔對輸入文件作處理。BEGIN模式經常被用來修改內置變量ORS,RS,FS,OFS等值。

awk數組

 

數組構成:

數組名[元素名]=值

如圖不難發現,awk數組就和酒店同樣。數組的名稱就像是酒店名稱,數組元素名稱就像酒店房間號碼,每一個數組元素裏面的內容就像是酒店房間裏面的人。

sed和awk實例

sed增刪改查演示

 

  1. 增a

例子1:添加單行

[root@ken ~]# sed ‘1a nihao’ test
root:x:0:0:root:/root:/bin/bash
nihao
bin:x:1:1:bin:/bin:/sbin/nologin

 

例子2:添加單行

[root@ken ~]# sed ‘2a nihao’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
nihao

 

例子3:添加多行

[root@ken ~]# sed ‘2a 1\n2\n3\n4\n5’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
1
2
3
4
5
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

 

例子4:行尾添加

[root@ken ~]# sed ‘$a nihao’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
nihao

 

增i

例子5:單行添加

[root@ken ~]# sed ‘1i nihao’ test
nihao
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

 

例子6:添加多行

[root@ken ~]# sed ‘1i 1\n2\n3\n4’ test
1
2
3
4
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

 

2.刪d

例子1:刪除指定行

[root@ken ~]# sed ‘1d’ test
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

例子2:刪除多行

[root@ken ~]# sed ‘1,9d’ test
operator:x:11:0:operator:/root:/sbin/nologin

 

例子3:刪除全文

[root@ken ~]# sed ‘d’ test

 

例子4:刪除指定行到結尾的行

[root@ken ~]# sed ‘3,$d’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

 

3.改 c

文本替換

 

接下來講的這個功能,有工做經驗的同窗應該很是的熟悉,由於使用sed軟件80%的場景就是使用替換功能。

這裏用到的sed命令,選項:
「s」:單獨使用–>將每一行中第一處匹配的字符串進行替換==>sed命令
「g」:每一行進行所有替換–>sed命令s的替換標誌之一(全局替換),非sed命令。
「-i」:修改文件內容–>sed軟件的選項,注意和sed命令i區別。

 

例子1:改指定的行

[root@ken ~]# sed ‘1c nihao’ test
nihao
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

例子2:改指定的幾行

[root@ken ~]# sed ‘1,3c nihao’ test
nihao
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

 

注意:之後再工做中若是你要修改一個配置文件,首先必須先要備份。

 

4.查p

例子1:打印第一行

[root@ken ~]# sed ‘1p’ test
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

例子2:不打印模式空間的內容

[root@ken ~]# sed -n ‘1p’ test
root:x:0:0:root:/root:/bin/bash

 

例子3:打印多行

[root@ken ~]# sed -n 「1,5p」 test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

 

sed替換

 

例子1:把全部行的第一個root替換爲ken

[root@ken ~]# sed ‘s/root/ken/’ test
ken:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/ken:/sbin/nologin

 

例子2:把全部行的root替換爲ken

[root@ken ~]# sed ‘s/root/ken/g’ test
ken:x:0:0:ken:/ken:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/ken:/sbin/nologin

 

 

sed正則

 

 

例子1:刪除root開頭的行

[root@ken ~]# sed ‘/^root/d’ test
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

 

例子2:刪除以sync結尾的行

[root@ken ~]# sed ‘/sync$/d’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

 

例子3:僅僅匹配以root開頭的行的root

[root@ken ~]# sed ‘/^root/{s/root/ken/g}’ test
ken:x:0:0:ken:/ken:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

 

例子4:使用sed開啓selinux

[root@ken ~]# sed -i 「s/\(SELINUX=\)disabled/\1enforcing/g」 /etc/sysconfig/selinux
[root@ken ~]# cat /etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted – Targeted processes are protected,
# minimum – Modification of targeted policy. Only selected processes are protected.
# mls – Multi Level Security protection.
SELINUXTYPE=targeted

 

sed多點操做

 

-e

例子1:刪除空白行和井號註釋的行

[root@ken ~]# sed -e 「/^$/d」 -e 「/^#/d」 test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

 

 

刪除註釋行和空白行

 

第一種方法:

[root@ken ~]# cp test{,.bak}
[root@ken ~]# ls
anaconda-ks.cfg a.out ken1 test test1 test2 test.bak test.txt
[root@ken ~]# grep -v -E 「(^$)|(^#)」 test.bak
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@ken ~]# grep -v -E 「(^$)|(^#)」 test.bak > test
[root@ken ~]# cat test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

 

第二種方法:

[root@ken ~]# sed -i -e ‘/^$/d’ -e ‘/^#/d’ test.bak
[root@ken ~]# cat test.bak
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

 

awk詳解

 

例子1:打印出來行號

[root@ken ~]# awk ‘{print NR,$0}’ test
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 i#adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
7 halt:x:7:0:halt:/sbin:/sbin/halt
8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
9 operator:x:11:0:operator:/root:/sbin/nologin

 

例子2:打印出來2,5行的內容

[root@ken ~]# awk ‘NR>=2&&NR<=5{print $0}’ test
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

分析awk處理過程:

讀取文本第一行,首先會和匹配模式進行相匹配,若是發現第一行內容不和模式相匹配的話,就繼續讀取下一行

讀取到第二行發現和模式相匹配,就會執行花括號裏面的動做

而後繼續讀取下一行,發現和模式相匹配,就會執行花括號裏面的動做

依次讀取全文

 

例子3:打印多餘五個字段的行

[root@ken ~]# awk -F 「:」 ‘NF>=5{print $0}’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

 

例子4:打印一冒號爲分隔符的最後一個字段

[root@ken ~]# awk -F 「:」 ‘{print $NF}’ test
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin

 

例子5:打印出來用戶名以及對應的shell類型

[root@ken ~]# awk -F 「:」 ‘{print $1,$NF}’ test
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
i#adm /sbin/nologin
lp /sbin/nologin
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin

 

[root@ken ~]# awk -F 「:」 ‘{print $1,$7}’ test
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
i#adm /sbin/nologin
lp /sbin/nologin
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin

 

[root@ken ~]# awk -F 「:」 ‘NR==2{print $1,$7}’ test
bin /sbin/nologin

 

例子6:輸出每行行號和該行有幾個字段

[root@ken ~]# awk -F 「:」 ‘{print NR,NF}’ test
1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
9 7

 

awk正則

 

例子1:打印出來以root開頭的行

[root@ken ~]# awk ‘/^root/{print $0}’ test
root:x:0:0:root:/root:/bin/bash
[root@ken ~]# awk ‘/^root/’ test
root:x:0:0:root:/root:/bin/bash

 

例子2:打印出來以halt結尾的行

[root@ken ~]# awk ‘/halt$/{print $0}’ test
halt:x:7:0:halt:/sbin:/sbin/halt

 

例子3:第五個字段包含root的行

[root@ken ~]# awk -F 「:」 ‘$5~/root/{print $0}’ test
root:x:0:0:root:/root:/bin/bash

 

提示:

  • $5表示第五個區域(列)
  • ~表示匹配(正則表達式匹配)
  • /root/表示匹配root這個字符串

$5~/root/表示第五個區域(列)匹配正則表達式/root/,既第5列包含root這個字符串,則顯示這一行。

 

awk的BEGIN

 

例子1:

[root@ken ~]# awk -F 「:」 ‘BEGIN{print 「user shell」}NR==2{print $1,$NF}’ test
user shell
bin /sbin/nologin

 

 

例子2:指定分隔符

[root@ken ~]# ip a | grep 「global」 | awk ‘BEGIN{FS=」 +|/」}{print $3}’
192.168.64.4

 

awk的END

 

例子1:

[root@ken ~]# awk ‘{print $0}END{print 「this is end」}’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
this is end

 

 

例子2:

[root@ken ~]# awk ‘BEGIN{i=0}/root/{i++}END{print i}’ test
2

或者

[root@ken ~]# awk ‘/root/{i++}END{print i}’ test
2

 

awk數組

 

統計域名出現的次數:

第一種方法:

[root@ken ~]# cat test | cut -d 「/」 -f 3 | sort | uniq -c | sort -rn
25 www.taobao.com
13 www.sina.com
7 www.qq.com

 

第二種方式:awk數組

[root@ken ~]# cat test | awk -F 「/+」 ‘{ken[$2]++}END{ for ( i in ken) print i,ken[i]}’
www.sina.com 13
www.qq.com 7
www.taobao.com 25

 

[root@ken ~]# cat test | awk -F 「/+」 ‘{ken[$2]++}END{ for ( i in ken) print ken[i],i}’ | sort -rn25 www.taobao.com13 www.sina.com7 www.qq.com

相關文章
相關標籤/搜索