shell文本三剑客——awk命令【☆】

目录

一、akw原理

二、命令格式

三、常用变量

四、awk的用法

1.输出整行内容

2.按字段输出文本内容

3.按列输出文件内容 FS变量为列分隔符

4.awk的三个模式

5. awk ‘控制语句条件 {操作}’ 文件

6.awk的数组

7.awk的应用


一、akw原理

        逐行读取文本,默认以空格或tab键为分隔符分割,将行内容分隔成各个字段保存到内建变量中,并按模式或条件执行编辑命令。与sed命令不同的是,sed常用于整行的处理,awk倾向于将一行内容分成多个字段再处理。在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

二、命令格式

awk 选项 ‘模式或条件 {操作}’ 文件1 文件2...

awk -f 脚本文件 文件1 文件2...

三、常用变量

  • FS:列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
  • NF:当前处理的行的字段个数。
  • NR:当前处理的行的行号(序数)。
  • $0:当前处理的行的整行内容。
  • $n:当前处理行的第n个字段(第n列)。
  • FILENAME:被处理的文件名。
  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是'\n'

四、awk的用法

1.输出整行内容

awk '{print $0}' 文件名     #打印所有行内容

awk 'NR==1{print $0}' 文件名     #打印第1行内容

awk 'NR>=10{print $0}' 文件名    #查看文件第十行及后面所有行的内容

awk '/^字符串/{print $0}' 文件名    #查看文件以“字符串”开头的所有行内容

awk '/字符串$/{print $0}' 文件名    #查看文件以“字符串”结尾的所有行内容,如果存在/,需要用\转义。

awk '(NR==10)||(NR==30){print $0}' 文件名    #查看文件的第10行和第30行内容

查看区间1-3行内的内容方法一:awk 'NR==1,NR==3{print $0}' 文件名

查看区间2-7行内的内容方法二:awk '(NR<=7)&&(NR>=2){print $0}' 文件名

awk '(NR>=7)||(NR<=2){print $0}' 文件名   #查看文件前2行和7行之后的内容

awk '/\/bin\/bash$/{print $0}' 文件名       #查看文件以/bin/bash结尾的行内容

awk '(NR%2)==0 {print $0}' 文件名    #打印文件的偶数行内容

awk '(NR%2)==1 {print $0}' 文件名    #打印文件的奇数行内容

awk '{print FNR,$0}' 1.txt 2.txt     #同时打印多个文件使用FNR显示行号不会连续计数

awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd     #统计文件中以XX结尾的行

2.按字段输出文本内容

awk -F '字段分隔符' 'NR==n {print $0}'          输出 第n行的 整行内容
awk -F '字段分隔符' 'NR==n {print $1}'          输出 第n行的 第一个字段的内容
awk -F '字段分隔符' 'NR==n {print $1,$NF}'  输出 第n行的 第一个字段和最后一个字段的内容
awk -F '字段分隔符' 'NR==n,NR==M {print $1}'     输出 第n行到第m行的 第一个字段的内容
awk -F '字段分隔符' 'NR>=n&&NR<=M {print $1}'   输出行号大于等于n小于等于m的行的第一个字段内容     
awk -F '字段分隔符' 'NR==n||NR==M {print $1}'   输出 第n行第m行的 第一个字段的内容
awk -F '字段分隔符' '/字符串/ {print $1}'        输出包含指定字符串的行的 第一个字段的内容
awk -F '字段分隔符' '/正则表达式/ {print $1}'  输出 匹配正则表达式的行的 第一个字段的内容
awk -F '字段分隔符' '$1>=n {print $0}'           输出第一个字段的数值大于等于n的 整行内容
                                    == != >= > <= <
awk -F '字段分隔符' '$1~"字符串" {print $0}'  输出第一个字段包含指定字符串的 整行内容
                                     ~(包含) !~(不包含) ==(等于) !=(不等于)

awk -F 指定分割符查看文件中以XX结尾的行内容的第x个字段

awk -F 指定分割符查看文件的多个字段

awk -F 指定分割符查看文件的第一个字段和最后一个字段(NF默认每行的字段数,每行字段不一致的话可以用$NF表示最后一个字段

用FS="分隔符" 查看指定字段(FS是列分割符的意思,先指定为":"再去执行,效果与awk -F相同)

awk -F: '$3<5 {print $0}' /etc/passwd    #查看文件第三个字段小于5的行内容

awk -F: '$3<5 {print $1,$NF}' /etc/passwd   #查看文件第三个字段小于5的行,只显示第1个和最后一个字段

awk -F: '!($3<1000) {print $1,$NF}' /etc/passwd      #查看文件第三个字段小于1000的行,显示第1和最后一个字段
awk -F: '!($3<1000) {print $0}' /etc/passwd      #查看文件第三个字段小于1000的行,显示整行内容

awk -F: '($3<5) {print NR; print $0}' /etc/passwd    #查看文件第三个字段小于5的行,显示行号和整行内容

 awk -F: '$7~"bash" {print NR,$0}' /etc/passwd      #查看第n个字段包含xx字符的行号和行内容

awk -F: 'NR==1||NR==2 {print $1}' /etc/passwd   #查看第一行和第二行的行的第一个字段

awk -F: 'NR>=3&&NR<=5 {print $0}' /etc/passwd   #查看行号大于等于三小于等于5的整行内容

awk 'BEGIN{OFS=":"};{$1=$1;print $0}' #指定输出内容的分隔符

3.按列输出文件内容 FS变量为列分隔符

awk ‘BEGIN{RS":"}; {print $0}’      指定列分割符为冒号输出整行内容

awk -F/ ‘BEGIN{RS":"}; {print $2}’   #指定列分割符为冒号,行分割符为斜杠,输出第二个字段的内容

4.awk的三个模式

awk三个模式里,多个大括号可以执行多个操作,也可以把对个操作用分号间隔合并到一个大括号里。

格式:awk ‘BEGIN {x=0}; 条件{...};END{...}’ 文件

  • begin表示处理文件前执行的操作;
  • 条件表示对匹配满足指定条件的文件行内容执行操作;
  • end表示处理完文件所有航内容后要执行的操作。

5. awk ‘控制语句条件 {操作}’ 文件

 awk '变量=条件表达式?值1:值2; {操作}' 文件    #行内容是否符合表达式,如果条件成立则变量取值1,条件不成立则变量取值2。【三元运算符 条件表达式?值1:值2】

awk '{if(语句条件) {操作}}’ 文件    #满足if的条件的行 则执行操作

awk 'BEGIN while("命令" | getline)每次循环的操作;{操作}' getline获取行内容并跳到下一行

6.awk的数组

awk 'BEGIN{a[0]=10;a[1]=20; print a[1]}'          --->输出结果为20

awk 'BEGIN{a[0]=10;a[1]=20; print a[0}}'          --->输出结果为10

awk 'BEGIN{a["abc"]=10;a["xyz"]=20;print a["abc"]}'        --->输出结果为10

awk 'BEGIN{a["abc"]=10;a["xyz"]=20;print a["xyz"]}'        --->输出结果为20

awk 'BEGIN{a["abc"]="aabbcc";a["xyz"]="xxyyzz";print a["xyz"]}'        --->输出结果为xxyyzz

awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a){print i,a[i]}}'    i 遍历的是变量a的下标

注意:BEGIN中的命令只执行一次。awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号

7.awk的应用

 awk查看内存使用率

free | awk '/Mem:/{print int($3/$2*100)"%"}'

awk命令查看cpu使用率

 top -b -n1 | awk -F, '/^%Cpu/{print $4}' | awk '{print 100-$1"%"}'

awk查看磁盘使用率

df | grep -w "/" | awk '{print $5}' | awk -F% '{print 100-$1"%"}'

awk查看系统运行时长

date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y%m%d %H:%M:%S"

awk获取IP地址

ifconfig ens33 | awk 'NR==2 {print $2}'

awk查看系统平均负载

uptime | awk -F, '{print $3}' | awk '{print $3}'

awk获取网卡流量

ifconfig ens33 | awk -F '(' '/RX packets/{print $2}' | awk -F ')' '{print $1}'

 awk将ssh远程登录失败超过5次的IP导入到黑名单里

  • 30
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值