awk也是按行来进行操作的,但是对行操作完之后可以根据指定命令来对行取列
awk的分隔符:他的默认分割符是空格或者tab键,多个空格,它会自动压缩成一个空格
格式: awk 选项 '模式或者条件{操作}'文件
操作默认为打印
-F:指定分隔符,如果是空格,不需要指定
-v:变量赋值
$0:打印所有内容
$n:处理行的第几列
NR:处理的行的行号
NF:处理当前行的字段个数,$NF就表示最后一个字段
FS:列分隔符,表示文本的分割符和F的作用一致。格式FS=";"
OFS:输出文本的分隔符
RS:指定分隔符为回车
内置变量$n要加$,其他的内置变量不用加$,更不能用引号,也不能用括号,否则会被当字符串来处理
0{print}:没有
1{print}:打印全部
{print NR}:只打印行号
{print NR,$0}:打印行号加内容
{print $0}:打印全部
NR==3{print}:打印第三行
NR==2,NR==4{print}:打印第二行到第四行
NR==2;NR==4{print}:打印第二行和AWK第四行
awk "NR&2==0{print}':偶数打印
awk "NR&2==1{print}':基数打印
BEGIN{print 10+20}:加法
BEGIN{print 10*20}:乘法
BEGIN{print 10/20}:除法
BEGIN{print 3**2}:求幂,3的2次方
BEGIN{print 3^2}:求幂,3的2次方
BEGIN{print 10.34+10.56}:支持小数运算
1.如果getline左右没有重定向符号(<,>)或者没有管道符(|)时,awk会先读第一行,但是如果加了getline会跳过第一行,读取第二行
2.如果两把有重定向符
面试题:利用awk重定向输出
awk '{getline < "test1.txt";print > "test2.txt"}'test1.txt
awk '/^root/{print}' /etc/passwd:以root为开头
awk '/bash$/{print}' /etc/passwd:以bash为结尾
格式:awk 'BEGIN{..};{..};END{..}' 文件名
在对文件进行操作之前,会先执行BEGIN{..}模式条件,或者是命令操作
中间的{..}是真正的用于处理文件的命令
END{..}结束语句,一般都是打印执行结果
面试题:通过awk获取文件中有多少行
awk 'BEGIN{i=0};{i++};END{print i}'
awk -F: '$4<10{print}' /etc/passwd | head -n 15:打印15行第四列比10小的行
awk -F: '!($4<10){print}' /etc/passwd | head -n 15:取反
awk -F: '{if ($3>10) {print}}' /etc/passwd:如果第三列大于10则打印
awk '{(条件表达式)?(A表达式或值):(B的表达式或值)}'
? 表示if
: 表示else
awk -F: '{i=($3>$4)?$3:$4;{print i}}' /etc/passwd
<、>、=:比较数值
$n~"字符串":表示第n个字段包含某个字符
$n!~"字符串":表示第n个字段不包含某个字符
$n=="字符串":表示第n个字段就是某个字符
$n!="字符串":表示第n个字段不是某个字符
指定第六个字段为/home/hqy 而且 第七个是/bin/bash,打印第一段和最后一段
awk -F: '($6=="/home/hqy")&&($7=="/bin/bash"){print $1,$NF}'/etc/passwd
定义数组
awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;print a}'