shell脚本三剑客之awk

目录

用法:

awk常用的内置变量:

awk的打印功能

awk运算:

awk的内置函数:getline

文本内容过滤打印

BEGIN模式:

 

变量赋值

awk的条件判断打印:

取反:

awk支持条件判断语句 if

awk条件判断打印:

三元表达式:类似JAVA

awk的精确筛选

awk和tr比较分隔符

awk定义数组

 例题:1.监控cpu使用率

 2.监控内存使用情况

3.监控硬盘使用情况

 4.统计/etc目录下文件大小


awk 文本三剑客之一,是功能最强大的文本工具

awk也是按行来进行操作,对行操作完之后,可以根据指定命令来对行取列

awk的分隔符:他的默认分隔符是空格或者tab键,但是多个空格,它会自动压缩成一个。

用法:

awk 选项 '模式或者条件 {操作}' 文件

-F:指定分隔符,如果是空格,不需要加F

-v:变量赋值

操作:默认就是打印

 

 

awk常用的内置变量:

$0:打印所有内容

$n:处理行的第几列

NR:处理的行的行号

NF:处理当前行的字段个数,$NF就表示最后一个字段

FS:列分隔符,指定文本的分隔符,和F作用一致 格式:FS=":"

OFS:输出文本的分隔符

RS:指定分隔符为回车

内置变量$n要加$,其他的内置变量不用加$,更不能用引号,也不能用括号,否则会被当成字符串来处理。

awk的打印功能

awk ''

 只打印行号:

 既打印行号,也打印内容

 

 

打印偶数行

awk 'NR%2==0{print}' test.txt

打印奇数行

awk 'NR%2==1{print}' test.txt

 

 

awk运算:

input:awk 'BEGIN{print 10+20}' output:30

input:awk 'BEGIN{print 3**2}' output::9 //3的平方

input::awk 'BEGIN{print 10.34+10.56}' output::20.9

input:awk 'BEGIN{print 10.2/20.3}' output::0.502463

**和^都表示求幂

awk的内置函数:getline

1.如果getline左右两侧没有重定向符号(<,>),或者没有管道符(|)时,awk会先读第一行,但是如果加了getline,会跳过第一行,读取第二行

awk '{getline;print}' test.txt 相当于偶数行打印

awk '{print;getline}' test.txt 相当于奇数行打印

2.如果两边有重定向或者管道符,getline作用于定向输入文件

awk '{getline < "test1.txt"; print > "test2".txt}' test1.txt

将test1里的文件提取出来,输出到test2文件中

ls | awk '{getline ky30;print,  ky30;}'

getline ky30 自定义的变量

ls输出的结果传给ky30
打印ls命令的输出结果

如果没有结果,打印空,不做任何操作。

文本内容过滤打印

awk 以root为开头

BEGIN模式:

awk 'BEGIN{..};{..};END{..}' 文件

在对文件进行操作之前,会先执行BEGIN{..}模式条件,或者是命令操作

中间的{..}是真正的用于处理文件的命令

END{..}结束语句,一般都是打印执行结果。

awk 'BEGIN{i=1};{i++};END{print i}' /etc/passwd //打印/etc/passwd文件的行数

 

变量赋值

-v变量赋值:

指的是改变分隔符

fs=":";awk -v FS=$fs -v OFS="+" '{print $1,$3}' /etc/passwd

定义一个变量为冒号,赋值给FS设置分隔符为fs的定义的变量冒号,然后输出文本的分隔符,用加号替换成冒号并打印第一行到第三行。

awk -v FS=":" -v OFS="@" '{print $1,$3}' /etc/passwd

 echo $PATH | awk -v RS=":" '{print $1}'

 

awk的条件判断打印:

cat /etc/passwd | head -n 15

取15行第三列大于10

awk -F: '$3>10{print}' /etc/passwd | head -n 15

取第四列小于10

 

取反:

awk -F: '!($4<10){print}' /etc/passwd | head -n 15

 

awk支持条件判断语句 if

打印所有第三列等于10的结果

awk -F: '{if ($3=10) {print}}' /etc/passwd

 

awk条件判断打印:

三元表达式:类似JAVA

awk '(条件表达式) ?(A表达式或者值): (B的表达式或者值)'

?表示if

:表示else

awk -F: '{i=($3>$4)?$3:$4;{print i}}' /etc/passwd | sed -n '1,6p'

1-6行

awk的精确筛选

$3>$4

< > = 用于比较数值

$n~"字符串":表示第n个字段包含某个字符

$n!~"字符串":表示第n个字段不包含某个字符

$n=="字符串":表示第n个字段就是某个字符

$n!="字符串":表示第n个字段不是某个字符

例题:打印第七个不是nologin,打印第一个字段和第三个字段

$NF:最后一个字段

awk -F: 指定第六个字段为/home/dn而且第七个字段是/bin/bash

 awk -F: 所有第三列不是0的,或者第四列大于10的结果

awk和tr比较分隔符

echo a b c d | tr " " ":"

echo a b c d | awk '{OFS=":"; $1=$1;print}'

几个字符给几个

awk定义数组

在awk当中,怎么样来定义数组

awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30; for(i in a)print i,a[i]}'

                                        用数组按照索引打印

 例题:1.监控cpu使用率

            

 2.监控内存使用情况

 

3.监控硬盘使用情况

 

 4.统计/etc目录下文件大小

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值