1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Linux 三劍客:awk 入門教程

        共 3326字,需瀏覽 7分鐘

         ·

        2021-04-19 15:26

        大家好,我是帥地。

        之前在 Linux 服務器上處理一些文件的時候,需要用到 awk,所以就順便把 awk 學了,也就有了這個入門教程。

        grep 大家應該很熟悉,不過單單掌握 grep 可能不夠用,如果學會 awk 等于你在 Linux 命令行里,又多了一種處理文本的選擇。

        awk 與 sed 和 grep,俗稱 Linux 下的三劍客,如果你把這三劍客都給收了,那就穩(wěn)妥了。

        這篇文章重點教你如何使用,看完這篇文章,就大致知道如何使用了,力求簡單使用,不做深入的探討。

        術語鋪墊

        在 awk 的文本處理規(guī)則里,awk 將文本文件視為由字段和記錄組成的文本數(shù)據(jù)庫。默認情況下,awk 將每一行視為一個記錄,也就是說記錄的分隔符是 \n,記錄的分隔符可以通過內(nèi)置變量 RS 更改。

        在每一個記錄中,又把記錄分為若干個字段,即記錄由字段組成,而字段的默認分隔符為空格或制表符。

        一、基礎用法

        和我們平常使用的 Linux 命令一樣, awk 也是遵循著某種格式來使用,格式如下:

        # 使用格式
        awk 執(zhí)行的事件 文件

        #
         例如:
        [root@iamshuaidi ~]# awk '{print $0}' test.txt
        my first language:Java
        second languange:python
        third language:C

        注:可以左右拉動,蘋果系統(tǒng)則不可以,蘋果直接換行了,由于時間關系,沒來得及解決,這里說聲抱歉。

        其中,print 表示打印, $0 表示一整個記錄,test.txt 表示一個文件,輸出的三種是 test.txt 里面的內(nèi)容。所以

        awk '{print $0}' test.txt

        表示把 test.txt 文件里面的每行記錄都打印出來。

        剛才我們說,記錄是由字段組成的,且字段的默認分隔符是空格或者制表符。下面我們打印每一個記錄的第一個字段,如下:

        # 打印每一行的第一個字段
        [root@iamshuaidi # awk '{print $1}' test.txt
        my
        second
        third

        $0 表示整個記錄,不過 $1, $2, $3 …..則表示整個記錄中的第一個字段,第二個字段……。

        注:awk 將每一行視為一個記錄,程序在執(zhí)行的時候,會遍歷所有記錄,然后打印出所有的字段

        剛才我們說字段的默認分隔符是空格或者制表符這些,默認意味著我們可以自己顯式著指定分隔符。下面我們用“:”來作為我們的分隔符吧。

        # 打印第二個字段
        [root@iamshuaidi ~]# awk -F ':' '{print $2}' test.txt
        Java
        python
        C

        上面我們用參數(shù) -F 指定了我們的分隔符,即如果想要指定字段的分隔符,可以用參數(shù) -F 指定分隔符。

        二、條件限制

        在打印文本的時候,我們可以指定一些條件。格式如下:

        awk 參數(shù) 條件 要執(zhí)行的動作 文件

        例如我們指定分隔符為“:”,條件為第二個字段為"Java"的記錄。

        # 打印第二個字段為"Java"的文本
        [root@iamshuaidi ~]# awk -F ':''$2 == "Java" {print $2}' test.txt
        Java

        打印奇數(shù)行的的第二個字段:

        # 打印奇數(shù)行的記錄
        [root@iamshuaidi ~]# awk -F ':' 'NR % 2 == 1 {print $2}' test.txt
        Java
        C

        其中,NR 是一個內(nèi)置的變量,表示當前正在處理的記錄,即當前的記錄是第幾個記錄。

        三、條件語句

        和我們平常的編程一樣,awk 也提供了 if, else, while 等這些條件語句。

        例如,打印第二個及其之后的記錄:

        root@iamshuaidi ~]# awk '{if(NR > 1) print $2}' test.txt
        languange:python
        language:C

        注意,上面的字段分隔符是空格了,并且 if 語句是在“{}” 里指定的。

        再看一個例子:

        # 如果第一個字段大于“s",則打印第一個字段,否則打印第二個字段
        [root@iamshuaidi ~]# awk '{if($1 < "s") print $1; else print $2}' test.txt
        my
        languange:python
        language:C

        上面打印的是:如果第一個字段大于“s",則打印第一個字段,否則打印第二個字段。

        四、函數(shù)

        awk 提供了一些內(nèi)置函數(shù)來供我們使用,一下常用的函數(shù)如下:

        tolower():字符轉(zhuǎn)為小寫。
        toupper():字符轉(zhuǎn)為大寫
        length():返回字符串長度。
        substr():返回子字符串。
        sqrt():平方根。
        rand():隨機數(shù)。

        例如,我們要把打印的字段轉(zhuǎn)化為大小

        # 第一個字段轉(zhuǎn)化為大寫輸出
        [root@iamshuaidi ~]# awk '{print toupper($1)}' test.txt
        MY
        SECOND
        THIRD

        五、變量

        剛才我們說 NR 是一個表示當前正在處理的記錄是第幾個記錄的內(nèi)置變量,常用的內(nèi)置變量如下:

        NR:表示當前處理的是第幾行
        NF:表示當前行有多少個字段
        FILENAME:當前文件名
        FS:字段分隔符,默認是空格和制表符。
        RS:行分隔符,用于分割每一行,默認是換行符。
        OFS:輸出字段的分隔符,用于打印時分隔字段,默認為空格。
        ORS:輸出記錄的分隔符,用于打印時分隔記錄,默認為換行符。

        例如我們要打印每一個記錄的最后一個字段,就可以使用變量 NF 了。

        [root@iamshuaidi ~]# awk '{print $NF}' test.txt
        language:Java
        languange:python
        language:C

        對了,剛才那個 NR 的變量也是挺好用的,例如:

        # 標記當前是第幾行,這樣看起來好像比較舒服?
        [root@iamshuaidi ~]# awk '{print NR ". "  $0}' test.txt
        1. my first language:Java
        2. second languange:python
        3. third language:C

        講到這里就大致結束了,這篇文章算是入門文章,屏蔽了很多細節(jié),大致介紹一下怎么使用,更多具體用法,可以根據(jù)自己想要實現(xiàn)的功能去查找相關函數(shù)哦。

        后續(xù)會更新兩外兩個劍客,到時候這些都會匯總到帥地的個人網(wǎng)站上。

        下破站地址:https://www.iamshuaidi.com

        點擊閱讀原文可直達,建議PC打開,手機閱讀體驗不好,歡迎你們來玩耍呀。

        瀏覽 38
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久久艹视频在线 | 中文字幕在线日本 | 欧美一级黄色片 | 无码的日韩精选 | 拉珠含精玩具调教h | 日本屄视频 | 亚洲内射视频 | 成人性生活片无码免费 | 女人的呻吟 | 毛片A片中文字幕在线视频 |