且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

awk工具使用

更新时间:2022-04-04 12:11:33


一. awk工具介绍

1. 相比sed用来处理一行数据,awk比较倾向将一行分成几个“字段”来处理。


2. awk命令的格式

    awk 'BEGIN{} {} END{}' filename

    (1)awk可以处理文件也可以读取来自前个命令的标准输出

    (2)awk主要是处理每一行的字段内的数据,默认的字段分割符是空格键或tab键

    (3)awk中BEGIN和END两个是可选项,BEGIN一般是用来初始化一些变量在处理文件之前执行,中间{}是每读取一行的时候都会执行,END则是处理完文件之后再执行


3. awk处理一行中每个字段都是有名称的,$0表示的是整行数据,$1表示的是第一个字段值,$2表示的是第二个字段值.....

    例如字符串"root 192.168.137.254 chenguolin chenguolin"有四个字段

    $0 = "root 192.168.137.254 chenguolin chenguolin"

    $1 = "root"

    $2 = "192.168.137.254"

    $3 = "chenguolin"

    $4 = "chenguolin"


4. awk几个比较重要的内置变量

   (1)NF: 每一行数据总的字段数

   (2)NR: 当前awk所处理的第几行数据

   (3)FS: 当前的分割符,默认是空格

   (4)FILENAME: 当前awk处理文件的名字


二. awk的输出

1. awk提供了两种输出print和printf

2. print的参数可以是变量,数值,字符串等等,字符串要用双引号“”括起来。printf和C语言格式输出一样,在复杂的输出格式中可以用printf。


三.awk使用举例
    假设有个文件in.txt,在awk内部可以和C语言一样格式使用。

    1. 输出文件的每一行

        awk '{print $0}' in.txt    //print会自动换行

    2. 输出每一行的第二个字段

        awk '{print $2}' in.txt

    3. 在打印文件之前,打印一行“output the file”

        awk '{BEGIN{print "output the file"} {print $0}}' in.txt

    4. 在打印完文件之后,打印一行“end of the file”

        awk '{print $0} END{print "end of the file"}' in.txt

    5. 如果每一行的第一个字段是“root”则打印
        awk '{if($1 == "root") print $0}' in.txt

    6. 打印奇数行

        awk '{if(NR%2 == 1) print $0}' in.txt

    7. 把两个文件中对应行合并,例如

        第一个文件是             第二个文件是

        root                             chenguolin

        root                             lab104

        则希望合并成

        root chenguolin

        root lab104

        比awk好的命令: paste -d" " file1 file2 > file3

        paste命令用来合并多个文件的行,默认是tab键分割符。

    8. 打印文件in.txt中每一行的当前行数,总的字段数,第一个字段和最后一个字段

        awk '{print NR,NF,$1,$NF}' in.txt

    9. awk处理多个文件是顺序读取文件的

        file1的内容

        root

        root

        file2的内容

        chenguolin 

        lab104

        命令: awk '{print $0}' file1 file2 > file3

        输出到file3中

        root

        root

        chenguolin

        lab104


四. awk 使用位运算

     1. awk内部不能使用&,^等位运算,只能使用函数

     2. and(v1, v2)    // v1 和 v2做&运算

       lshift(val, count)   // 左移count位 

         or(v1, v2)           // 或运算