中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux命令學習手冊-awk

發布時間:2020-08-18 23:44:51 來源:ITPUB博客 閱讀:168 作者:vaqeteart 欄目:建站服務器

awk '條件類型1{動作1} 條件類型2{動作2} ...' filename

功能

相較于 sed 常常作用于一整個行的處理, awk 則比較傾向于一行當中分成數個『字段』來處理。

描述

awk 的處理流程

  1. 讀入第一行,并將第一行的資料填入 $0, $1, $2…. 等變數當中;

  2. 依據 “條件類型” 的限制,判斷是否需要進行后面的 “動作”;

  3. 做完所有的動作與條件類型;

  4. 若還有后續的『行』的數據,則重復上面 1~3 的步驟,直到所有的數據都讀完為止。

經過這樣的步驟,您會曉得, awk 是『以行為一次處理的單位』, 而『以字段為最小的處理單位』。

常用變量(變量名稱 代表意義)

NF 每一行 ( $0 ) 擁有的字段總數

NR 目前 awk 所處理的是『第幾行』數據

FS 目前的分隔字符,預設是空格鍵

每一行的每個字段的變量名稱就是 $1, $2 … 等。還有個例外,那就是 $0 代表一整行的意思。

注意, awk 后續的所有動作以 ‘ 括住, 所以,內容如果想要以 print 打印時,記得,非變量的文字部分, printf 提到的格式中,都需要使用雙引號.

邏輯運算符號

大于

< 小于

= 大于或等于

<= 小于或等于

== 等于

!= 不等于

舉例

假設輸入輸出如下:

$last
dmtsai   pts/0        192.168.1.12     Mon Aug 22 09:40   still logged in
root     tty1                          Mon Aug 15 11:38 - 11:39  (00:01)
reboot   system boot  2.6.11           Sun Aug 14 18:18         (7+15:41)
dmtsai   pts/0        192.168.1.12     Fri Aug 12 12:07 - 12:08  (00:01)
  • 打印每行的第1列和第三列,并且用[TAB]隔開

    輸入輸出如下

    $last | awk '{print $1 "\t" $3}'
    dmtsai  192.168.1.12
    root    Mon
    reboot  boot
    dmtsai  192.168.1.12
    

    這里,我們沒有設定條件,也就是無論哪一行都做同樣處理,所以第2,3行顯示的有點”不正常”。由此可知awk是“迭代”處理每一行的。

  • 列出每一行的賬號,目前處理的行數, 以及該行有多少字段

    輸入輸出如下

    $last | awk '{print $1 "\t lines: " NR "\t columes: " NF}'
    dmtsai   lines: 1        columes: 10
    root     lines: 2        columes: 9
    reboot   lines: 3        columes: 9
    dmtsai   lines: 4        columes: 10
    
  • 查閱 /etc/passwd ,第3欄小于 10 以下的數據,并且僅列出賬號與第3欄

    輸入輸出如下:

    $cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'
    root:x:0:0:root:/root:/bin/bash
    bin      1
    daemon   2
    ......(以下省略)......
    

    這里,在 /etc/passwd 當中是以冒號 “:” 來作為字段的分隔,所以需要設置一下。但是我們讀入第一行的時候, 那些變數 $1, $2… 預設還以空格鍵為分隔,所以雖然我們定義了 FS=”:” 了, 但是卻僅能在第二行后才開始生效(可能因為一般第一行僅僅是列名不需處理,而這里卻是特例,見例4改進)。

  • 對上面過濾的操作改進

    輸入輸出如下:

    $ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
    root     0
    bin      1
    daemon   2
    ......(以下省略)......
    

    利用 BEGIN 這個關鍵詞,可以從第一行就生效了。實際除了BEGIN,還有END。

假設如下表(pay.txt)

Name    1st     2nd     3th
VBird   23000   24000   25000
DMTsai  21000   20000   23000
Bird2   43000   42000   41000
  • 計算每一行總額,添加追加到最后一列

    輸入輸出如下:

    $awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" }
    NR>=2{total = $2 + $3 + $4
    printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'
    Name        1st        2nd        3th      Total
    VBird      23000      24000      25000   72000.00
    DMTsai      21000      20000      23000   64000.00
    Bird2      43000      42000      41000  126000.00
    

    注意:所有的動作在 {} 內,如需多個指令輔助,可利用分號 ; 間隔或直接以 [Enter] 按鍵來隔開每個指令,例如上面的 NR>=2 后面接的動作, 利用 total = … 那個指令來指定加總,而后續則以 printf 來格式化輸;格式化輸出時,在 printf 的格式設定當中,務必加上 \n ,才能進行分行;與 bash shell 的變量不同,在 awk 當中,變量可以直接使用,不需加上 $ 符號(如total)。

其它

參考資料: 《鳥哥的私房菜》

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

隆德县| 莲花县| 慈利县| 康定县| 阿拉尔市| 德钦县| 五华县| 涟水县| 孝义市| 阿尔山市| 亚东县| 闽清县| 任丘市| 上林县| 吉林市| 新兴县| 青铜峡市| 南通市| 信宜市| 隆子县| 西安市| 吉木萨尔县| 东至县| 连江县| 庆云县| 勃利县| 新竹市| 皮山县| 张家界市| 云阳县| 蓬溪县| 巨野县| 红桥区| 楚雄市| 吉林市| 山西省| 宁远县| 桃园市| 永嘉县| 韶关市| 榆中县|