awk是文本三剑客之一,功能最强大的文本工具。
逐行读取输入的文本内容,默认以空格和tab键作为分隔符,但是多个空格或者tab键的空格,会自动压缩成一个。按照指定的模式或者条件执行编辑命令
也是逐行匹配。对符合条件的才会进行格式化输出或者过滤
可以在免交互的情况下实现复杂的文本操作。完成自动化的配置。
awk '操作符 action’file
目的 方法 处理对象
awk'BEGIN{x=1};{x++};END{处理动作}'文件名
awk'操作符{处理动作}'文件名
BEGIN对条件做初始化操作
for ((i=1;i<=10;i++))
awk的常用选项:
-F指定分隔符,如果是空格,tab键,可以不加
FS:列分隔符和F作用一致,如果使用FS,FS=”:”
OFS:输出内容的列分隔符
NF:最后一个字段
$n:内置变量
-v变量赋值。
awk'{print}'/etc/passwd
打印文本内容
内置变量:
NR:需要处理行的行号
打印行号:awk'{print NR,$0}'/etc/passwd
awk 'NR==3,NR==5{print}' test.txt#第三行到第五行
awk 'NR==3;NR==5{print}' test.txt第三行和第五行
awk 'NR%2==0{print}' test.txt偶数行
awk 'NR%2==1{print}'test.txt奇数行
awk -F: ‘ {print $2,$NF}' /etc/passwd
NF:表示最后一列。
$n(><==):进行数值对比
$n~"字符串”:代表这个字段包含某个字符串
$n!~"字符串":代表这个字段不包含某个字符串
$n==“字符串”:代表这个字段要和字符串相同。
$n!=“字符串”:取反,不为某个字段
$NF:代表最后一个字段
1、/etc/passwd
输出最后一个字段中包含bash所在行的第一个字段和最后一个字段
2. /etc/passwd只有第一列是root的行,才打印它的第六列。
3.输出最后一个字段,不包含bash,然后打印:第一列和第六列
4.指定第六个字段为/home/dn而且最后一个字段为/bin/bash,满足条件的输出第一列和最后一列。
5.打印出所有第三列大于500的,然后输出全部内容。/etc/passwd
条件判断打印:
if语句:
if $3>500 打印所有:
awk的三元表达式:继承了java,格式和java也一样
awk{条件表达式1?A表达式或者值:B表达式或者值}文件名
awk -F: ‘ {max=($3>=$4)?$3:$4;{print max $0}} /etc/passwd’
?:
if else
if[$3>=$4]
then
echo $3
else
echo $4
fi
文本内容过滤打印
getline函数:getline和管道符以及重定向符号在一块的时候,
重定向:<>把其中一个文件的内容传给另外一个
|:输出指定内容,到定义的变量,getline调用变量当中的内容,打印结果。
getline函数运行之后会改变awk的内置变量,读取的行数也就发生变化,
getline在前,就是第一行跳过,打印第二行偶数行
getline在后,从第一行开始,跳过第二行,打印的就是奇数
BEGIN模式:
对变量初始化:
索引下标的值是唯一的。
awk'{a[$1]++};END{for(i in a){print i,a[i]}}'ky32.txt