目录
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目录下文件大小