Linux之awk命令

awk可以接收文件和标准输入

awk 'BEGIN{ print "start" } /pattern/ { commands } END{ print "end" }' file
  1. 执行BEGIN { commands } 语句块中的语句,“BEGIN”需大写
  2. 从文件或stdin中读取一行,然后执行pattern { commands }。重复这个过程,直到文件全部被读取完毕。
  3. 当读至输入流末尾时,执行END { commands } 语句块,“END”需大写
  4. 中间部分默认执行{ print }
  5. pattern用于过滤匹配哪些行,没有提供样式那么awk就认为所有的行都是匹配的
  6. 当print的参数是以逗号进行分隔时,参数打印时则以空格作为定界符

简单例子:

$ echo -e "line1\nline2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" } '
Start
line1
line2
End

awk变量

内部使用变量不需要$符号,加$符号表示打印第几列;另外内部变量也是字符串

内建变量
变量描述
FIELDWIDTH字段宽度,用于没有分隔符的情况,设置之后FS将不起作用
FS列分隔符(默认是空格)
RS行分隔符(默认换行符)
OFS输出的列分隔符(默认是空格)
ORS输出的行分隔符(默认换行符)
NR已读行数
FNR当前文件已读行数(当读取另一个文件时,FNR将被重置为1)
NF字段总数
IGNORECASE是否忽略大小写
自定义变量
  1. 内部自定义变量
awk '{name="tuyou";print tuyou}' 
  1. 命令行变量
awk -f script n=1 data.txt #这种命令行变量在BEGIN部分不可用
awk -v n=1 -f script data.txt #这种即可以BEGIN使用变量
awk -v name=tuyou '{print name}'

数组

awk的数组叫关联数组,也就是说数组的索引值可以是任意字符串。索引顺序可能和加入顺序不一致

定义数组
arrayName[index]=value
遍历数组
for (var in arrayName) {
    
}
删除数组元素
delete arrayName[index]

行过滤方式

正则表达式
awk '/pattern/{print $0}' #过滤出只有匹配正则表达式的行
匹配操作符
awk '$n ~ /pattern/{print $0}' #过滤出第n列匹配pattern的行
awk '$n !~ /pattern/{print $0}' #过滤出第n列不匹配pattern的行
数学表达式
awk '$n == 0{print $0}' #匹配出第n列等于0的行

分支语句

awk '{
    if(condition){
        
    }else if(condition){
        
    }else{
        
    }
}'

循环语句

awk '{
    while(condition){
        break; //支持break
        continue; //支持continue
    }
}'

awk '{
    do{
        break; //支持break
        continue; //支持continue
    }while(condition)
}'

awk '{
    for (i = 0; i < n; i++) {
        
    }
}'

格式化输出

awk '{printf "format string", x, y, z...}'

format格式

%[modifier]control-letter
控制字符说明
c将一个数字作为ascii字符显示
d显示一个整数值
i和d一样
s显示一个字符串
f显示一个浮点数
o显示八进制
x显示十六进制
X显示十六进制,字符大写表示

modifier

-width.prec
修饰字符说明
width指定最小宽度,小于用空格填充
prec指定小数的小数位长度,或者字符串的最大长度
-左对齐

内建函数

数学函数
函数说明
int(x)小数取整
exp(x)指数函数
log(x)自然对数
rand()0到1的随机数
srand(x)0到1的随机数,指定随机种子
sqrt(x)平方根
sin(x)x的正弦,x以弧度为单位
cos(x)x的余弦,x以弧度为单位
tan(x)
atan2(x,y)x/y的反正切,x和y以弧度为单位
字符串函数
函数说明
asort(s [,d])将数组s按数据元素值排序。索引值会被替换成表示新的排序顺序的连续数字。另外,如果指定了d,则排序后的数组会存储在数组d中
asorti(s [,d])将数组s按索引值排序。生成的数组会将索引值作为数据元素值,用连续数字索引来表 明排序顺序。另外如果指定了d,排序后的数组会存储在数组d中
gensub(r, s, h [, t])查找变量$0或目标字符串t(如果提供了的话)来匹配正则表达式r。如果h是一个以g 或G开头的字符串,就用s替换掉匹配的文本。如果h是一个数字,它表示要替换掉第h 处r匹配的地方
gsub(r, s [,t])查找变量$0或目标字符串t(如果提供了的话)来匹配正则表达式r。如果找到了,就 全部替换成字符串s
index(s, t)返回字符串t在字符串s中的索引值,如果没找到的话返回0
length([s])返回字符串s的长度;如果没有指定的话,返回$0的长度
match(s, r [,a])返回字符串s中正则表达式r出现位置的索引。如果指定了数组a,它会存储s中匹配正 则表达式的那部分
split(s, a [,r])将s用FS字符或正则表达式r(如果指定了的话)分开放到数组a中。返回字段的总数
sprintf(format,variables)用提供的format和variables返回一个类似于printf输出的字符串
sub(r, s [,t])在变量$0或目标字符串t中查找正则表达式r的匹配。如果找到了,就用字符串s替换 掉第一处匹配
substr(s, i [,n])返回s中从索引值i开始的n个字符组成的子字符串。如果未提供n,则返回s剩下的部 分
tolower(s)将s中的所有字符转换成小写
toupper(s)将s中的所有字符转换成大写
时间函数
函数说明
mktime(datespec)将一个按YYYY MM DD HH MM SS [DST]格式指定的日期转换成时间戳值
strftime(format[,timestamp])将当前时间的时间戳或timestamp格式化(采用shell函数date()的格式)
systime( )返回当前时间的时间戳

自定义函数

function name([variables]) {
    statements
    return value
}

定义函数时,它必须出现在所有代码块之前(包括BEGIN代码块)

gawk '
> function myprint()
>{
> printf "%-16s - %s\n", $1, $4
>}
> BEGIN{FS="\n"; RS=""} 
>{
> myprint()
> }' data2
创建函数库
 $ cat funclib
function myprint()
{
  printf "%-16s - %s\n", $1, $4
}
function myrand(limit)
{
  return int(limit * rand())
}
function printthird()
{
    print $3 
}
$ cat script4
    BEGIN{ FS="\n"; RS=""}
    {
        myprint() 
    }
$ gawk -f funclib -f script4 data.txt
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值