真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux命令學(xué)習手冊-awk

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

成都創(chuàng)新互聯(lián)服務(wù)項目包括柯坪網(wǎng)站建設(shè)、柯坪網(wǎng)站制作、柯坪網(wǎng)頁制作以及柯坪網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,柯坪網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到柯坪省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

功能

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

描述

awk 的處理流程

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

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

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

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

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

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

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

NR 目前 awk 所處理的是『第幾行』數(shù)據(jù)

FS 目前的分隔字符,預(yù)設(shè)是空格鍵

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

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

邏輯運算符號

大于

< 小于

= 大于或等于

<= 小于或等于

== 等于

!= 不等于

舉例

假設(shè)輸入輸出如下:

$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
    

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

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

    輸入輸出如下

    $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 以下的數(shù)據(jù),并且僅列出賬號與第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 當中是以冒號 “:” 來作為字段的分隔,所以需要設(shè)置一下。但是我們讀入第一行的時候, 那些變數(shù) $1, $2… 預(yù)設(shè)還以空格鍵為分隔,所以雖然我們定義了 FS=”:” 了, 但是卻僅能在第二行后才開始生效(可能因為一般第一行僅僅是列名不需處理,而這里卻是特例,見例4改進)。

  • 對上面過濾的操作改進

    輸入輸出如下:

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

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

假設(shè)如下表(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
    

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

其它

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


網(wǎng)頁題目:Linux命令學(xué)習手冊-awk
標題網(wǎng)址:http://weahome.cn/article/jpsdgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部