awk命令的使用

    技术2026-02-18  16

    -------------参考网络视频

    0、前言

    awk命令是用来处理文件内容中的列数据,与sed处理行数据刚好对应;所以二者经常同时使用。

    awk是3个创始人名字首字母的。

    awk默认是以空格或Tab分隔。

    当不是以二者分隔的话,需指定参数-F+分隔符 ,比如以冒号分隔

    awk  -F: '{print $7}'  /etc/passwd

    比如以空格分隔

    awk  -F " " '{print $7}'  /etc/passwd

    1、awk语法结构:

    awk   参数  脚本语句’   待操作语句

    awk   参数  -f  '脚本文件'    待操作文件

    脚本语句格式:

    /pattern/{actions}        -------------->pattern是正则表达式,actions是操作

    condition{actions}

    -------------->actions区别与sed,awk命令的actions需要用{}括起来。

    $0 会打印所有的列;

    $1 会打印第1列;

    以此类推

    2、举例:

    某产品的库存量低于75则在行末标注需要订货

    //testfile内容:

    productA   30

    productB  76

    productC 55

    以下3种形式都可以:

    其中的;分号都可以省略。

    printf的格式与c语言中的格式完全相同:需要添加\n, 因为printf不带换行功能 

    awk '$2<75 {printf("%s\t%s\n),$0,"REORDER";} $2>=75 {print $0;}' testfile

     printf也可以不使用()

    awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile

     print自带换行功能:注意在"  REORDER"  字符串里面添加空格才有效,如果不添加空格会紧跟在原内容后面

    awk '$2<75 {print $0 " REORDER";} $2>=75 {print $0;}' testfile

    结果如下: 

    productA   30   REORDER

    productB  76

    productC 55  REORDER

    此外:

    awk命令的condition还可以是两个特殊的conditon,BEGIN和END,

    BEGIN后面的actions在处理整个文件之前执行一次;

    END后面的actions在整个文件处理完之后执行一次。

    awk命令可以像C语言一样使用变量(但不需要定义变量)

    例:统计一个文件的空行数:

    awk '/^ *$/ {x=x+1;} END {print x;}' awk.sh

    例:统计进程号在2600和2700之间的 有多少?

    ps aux|awk '$2<2700 && $2>2600 {x=x+1;} END {print x;}'

    与EDN 对应的宏是BEGIN

    BEGIN  :pattern未匹配文件之前执行某些操作,后面跟上{}

    EDN :pattern匹配文件结束之后,执行某些操作,后面跟上{}

    awk 'BEGIN {FS=":"} {print $7}' /etc/passwd

     结果等价于 -F 参数

     awk  -F: '{print $7}'  /etc/passwd

    Processed: 0.009, SQL: 10