awk的用法
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
格式为:
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
基本用法
log.txt的内容为:
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
- 用法一:行匹配语句 awk
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
例:
awk '{print $1,$4}' log.txt #每行按空格或TAB分割,输出文本中的1、4项
awk '{printf "%-8s %-10s\n",$1,$4}' log.txt #格式化输出
- 用法二:
awk -F #-F相当于内置变量FS, *指定分割字符*
例
awk -F, '{print $1,$2}' log.txt #使用 “,(逗号)”分割
注:-F,指使用逗号来做分隔符,第一行中没有逗号,因此第一行中所有字符都是第一个字符。
awk 'BEGIN{FS=","} {print $1,$2}' log.txt #使用内建变量,和awk -F, '{print $1,$2}' log.txt 相同
awk -F '[ ,]' '{print $1,$2,$5}' log.txt。#使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
- 用法三:
awk -v # 设置变量
例:
awk -va=1 '{print $1,$1+a}' log.txt #设置变量a为1
awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
- 用法四:
awk -f {awk脚本} {文件名}
awk '$1>2' log.txt #过滤第一列大于2的行
awk '$1==2 {print $1,$3}' log.txt #过滤第一列等于2的行
awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #过滤第一列大于2并且第二列等于'Are'的行
内建变量的使用
awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
awk '{print NR,$1,$2,$3}' log.txt #输出顺序号 NR, 匹配文本行号
awk '{print $1,$2,$5}' OFS=" $ " log.txt #输出字段分隔符,默认值与输入字段分隔符一致
使用正则,字符串匹配
awk '$2 ~ /th/ {print $2,$4}' log.txt #输出第二列包含 "th",并打印第二列与第四列
awk '/re/ ' log.txt # 输出包含 "re" 的行
忽略大小写
awk 'BEGIN{IGNORECASE=1} /this/' log.txt #输出包含this的行
模式取反
awk '$2 !~ /th/ {print $2,$4}' log.txt #输出不包含th的行
awk '!/th/ {print $2,$4}' log.txt
awk脚本
awk脚本文件为:hello.awk
解释器:
#!/usr/bin/awk -f
运行方法为:
awk -f hello.awk
格式
BEGIN {
......(执行前的语句)
}
{
......(处理时执行的语句)
}
END {
......(处理完所有行后所要执行的语句)
}
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
例:输出hello world语句
#!/usr/bin/awk -f
BEGIN {print "hello world"}
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
打印九九乘法表
seq命令
seq命令用于产生从某个数到另外一个数之间的所有整数。
格式:
seq [选项]... 尾数
seq [选项]... 首数 尾数
seq [选项]... 首数 增量 尾数
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
例:
seq 9
seq 2 9
seq -f "%3g" 9 11 #%后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格
seq -f "str%03g" 9 11 #数字位数不足部分是0,%前面制定字符串
seq -w 98 101 #-w指定输出数字同宽
seq -s '=\n' 1 5 #-s指定分隔符