awk命令

awk 是一种强大的文本分析工具,常与grep、sed并称为shell文本处理三剑客。awk通过模式和动作处理文本,可以进行复杂的格式化。它允许用户自定义字段分隔符,并提供了数学运算、逻辑关系、比较操作符等功能。本文介绍了awk的基本用法,包括正则匹配、内置函数和结构化语句,并给出了多个实际示例,如匹配特定行、打印指定字段等。通过awk,可以实现对文本数据的精细筛选和处理。

简介

awk是一种处理文本文件的语言,是一个强大的文本分析工具,grep、sed、awk并称为shell中文本处理的三剑客。

shell命令三剑客的比较

  • grep更适合单纯的查找或匹配文本
  • sed更适合编辑匹配到的文本
  • awk更适合格式化位版本,对文本进行复杂格式处理。

awk命令与sed一样,均是一行一行的读取、处理。区别在于sed作用与一整行的处理,而awk将一行分成数个字段来处理

awk命令详解
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:          GNU long options: (standard)
        -f progfile             --file=progfile  //通过文件读入awk命令,-f filename
        -F fs                   --field-separator=fs //指定分隔符号,默认是通过空格和tab进行隔开,指定冒号为分隔符 -F:
        -v var=val              --assign=var=val   //赋值一个用户定义变量
Short options:          GNU long options: (extensions)
        -b                      --characters-as-bytes
        -c                      --traditional
        -C                      --copyright
        -d[file]                --dump-variables[=file]
        -D[file]                --debug[=file]
        -e 'program-text'       --source='program-text'
        -E file                 --exec=file
        -g                      --gen-pot
        -h                      --help
        -i includefile          --include=includefile
        -l library              --load=library
        -L[fatal|invalid|no-ext]        --lint[=fatal|invalid|no-ext]
        -M                      --bignum
        -N                      --use-lc-numeric
        -n                      --non-decimal-data
        -o[file]                --pretty-print[=file]
        -O                      --optimize
        -p[file]                --profile[=file]
        -P                      --posix
        -r                      --re-interval
        -s                      --no-optimize
        -S                      --sandbox
        -t                      --lint-old
        -V                      --version

awk用法

awk完成语法

awk [选项参数] 'BEGIN{commands} pattern{commands} END{commands}' file
简单用法

awk ‘/模式/{动作}’

这个用法简单来说就是通过模式筛选,然后通过动作处理

  • awk命令需要用单引号
  • awk动用用花括号包裹
  • 模式是指正则匹配或者条件表达式,或者两者混用
  • 正则需要使用’/'作为界定符
  • 多个动作之间用分号隔开

示例1,只有模式时,相当于grep,可以进行匹配搜索等
在awk的正则中’^‘、’<‘,都是表示以什么开头,’$‘,’>'以什么结尾

awk '/^root/' /etc/passwd
awk '/\>root/' /etc/passwd
awk '/bash$/' /etc/passwd
awk '/bash\>/' /etc/passwd

在这里插入图片描述

示例2 只有动作,则执行动作

who |awk '{print $1}'

在这里插入图片描述

示例3 ,使用-F分割

awk -F: '/^[rp]/{print $1,$7}' /etc/passwd
// 以r或者p开头,打印第一个和第7个字段

在这里插入图片描述

awk正则中^ 在中括号内外的意思同样不一样,括号内表示取反,括号外表示开头

awk -F: '/^[^rp]/{print $1,$7}' /etc/passwd

//不以r或p开头的行的第一个和第七个字段

这个有点高级,可以指定两个分割符号

awk -F'[:/]' '{print $1,$10}' /etc/passwd
//以冒号或者左斜杠作为分隔符显示第1列和第10列
awk的操作符
  • 数学运算:+,-,*,/, %,++,–
  • 逻辑关系符:&&, ||, !
  • 比较操作符:>,<,>=,!=,<=,==,(匹配正则表达式),!(不匹配正则表达式)
  • 文本数据表达式:== (精确匹配)
  • ~波浪号表示匹配后面的模式

在加入操作符之后,就可以进行更加复杂一些的匹配筛选,从而使精度得到提升。

who | awk '$2 ~ /pts/{print $1}'  //在$2里查找匹配/pts/的,有就输出$1
seq 10 | awk '$1 % 5 == 0 || $1 ~ /^1/{print $1}' //输出1~10能被5整除的或者以1开头的数字
awk命令内置函数

length函数

利用length计算字符数目的函数来检查有无空口令用户

awk -F: 'length($2)==0{print $1}' /etc/passwd /etc/shadow

system函数
该函数可以用来执行系统命令

利用awk的system命令在/tmp/lp下建立/etc/passwd中与用户名同名的目录

awk -F: '{system("mkdir /tmp/lp/" $1)}' /etc/passwd
awk结构化语句

单分支

awk -F: '{if($1 ~ /\<...\>/)print $0}' /etc/passwd //如果用户名长度为三,则打印整行

在这里插入图片描述

双分支以及多分支

awk -F: '{if($3 != 0) print $1 ; else print $3}' /etc/passwd  //双分支
awk -F: '{if($1=="root") print $1;else if($1=="ftp") print $2;else if($1=="mail") print $3;else print NR}' /etc/passwd  //多分支

示例:利用awk的if多重分支判断用户的类型,root显示为管理员,uid在(0,500)显示为系统用户,uid在[500,60000]之间显示为普通用户,大于6万显示为其他用户。

awk -F: '{if($3==0) print $1,"管理员";else if($3>0 && $3<500) print $1,"系统用户";else if($3>=500 && $3 <= 60000) print $1,"普通用户";else print $1,"其它用户"}' /etc/passwd

如果想要更加详细的学习,可以看一下,参考链接,有一些更高级的用法,更详细的例子

参考

https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
https://blog.csdn.net/qq_18312025/article/details/105588874
https://wangchujiang.com/linux-command/c/awk.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值