linux常用工具awk,linux工具之awk

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

awk不仅仅是linux系统上的一个命令,它更是一种编程语言,可以用来处理数据和生成报告

awk处理的数据来源可以是文件,也可以是标准输入;其可以在命令行上直接编辑命令进行操作,同时还可以写成程序去处理复杂的任务

基本用法

有数据文件内容如下:jack, male, 28, beijing

yuanyuan, female, 26, chongqing

xiao, female, 26, sichuan

straw, male, 25, shanghai

lili, female, 23, chongqing

例子:CMD:

cat data.txt |awk -F"[, ]+" '$2 ~ /female/ {print NR,$3,$NF}'

OUTPUT:

2 26 chongqing

3 26 sichuan

5 23 chongqing

awk命令构成awk [options] 'pattern {action}' file

其中-F"[, ]+"是选项,$2 ~ /female/是模式,{print NR,$3,$NF}是动作;

域和记录

awk中默认将一个记录按空格作为分隔符来分割为多个域,可以使用选项-F指定自定义域分隔符

分割为多个域后通过$来访问,如果将一个记录分割后的域当做数组的话,那这个数组是从1开始计数的;$1表示第一个域,$2表示第二个域,…,$NF表示最后一个域;如果要访问整行记录使用$0

相关变量变量含义说明NFnumber of field,域总数可以通过$NR访问最后一个域

FS输入域分隔符可以通过BEGIN{FS="[, ]+"}达到与-F参数同样的效果,如:cat data.txt |awk 'BEGIN{FS="[, ]+"} $2 ~ /^f/ {print $1,$3}'

OFS输出域分隔符与FS类似,也是在BEGIN阶段设置

记录

awk中默认将每一行作为一个记录,意思是awk会按换行符将文件的内容分为多个记录,拿上面的例子,每个人的所有信息为一个记录。在模式与动作中可以使用变量NR,这个变量表示当前处理的记录号,默认记录分隔符的话就应该是行号

相关变量变量含义说明NRnumber of record,当前记录的计数默认是行号

RS记录的分隔符默认是换行符

ORS输出域分隔符默认是换行符

action

上面例子中的print是动作,表示要打印到标准输出,这是比较常见的动作,经常会使用。

这里的动作将应用于当前的记录

pattern

这里使用~来进行正则匹配,表示第2列满足后面的正则表达式的记录才执行后面的动作,支持的匹配方法:符号示例解释~$2 ~ /female/匹配//中的正则表达式的记录才会执行动作

!~$2 ~ /male/不匹配//中的正则表达式的记录才会执行动作

>$3 > 25年龄大于25的动作才执行动作

==$3 == 28年龄为28的记录才执行动作

&&$3 > 23 && $3 < 28多条件同时成立

||$3 < 25 || $3 > 26多条件求并集

关于正则表达式常见符号符号解释示例说明^匹配开头如:$2 ~ /^f/

$匹配结尾如:$1 ~ /w$/

{m,n}匹配数量$1 ~ /^[a-z]{4,5}$/某些awk版本可能需要参数--posix

options参数解释示例说明-F指定域分隔符-F"[, ]+"、-F:默认为空格

–posix使用posix标准正则表达式

awk工作方式按行分割符读取一个记录到缓存区

按域分隔符将该记录分割为一个一个域

如果存在pattern部分,进入第4步;如果不存在pattern部分,直接进入第5步

如果满足pattern的条件,进入第5步;如果不满足pattern的条件回到第1步

执行动作

进阶用法

BEGIN与END模块

BEGIN模块

awk读取文件前就执行BEGIN模块的代码,一般用来定义内置变量的值,比如设置记录分隔符RS、ORS、域分隔符FS、ORS、自定义变量等CMD:

cat data.txt |awk 'BEGIN{FS="[, ]+";OFS=":"} {print $1,$3}'

OUTPUT:

jack:28

yuanyuan:26

xiao:26

straw:25

lili:23

# 如果有BEGIN阶段还有pattern条件

CMD:

cat data.txt |awk 'BEGIN{FS="[, ]+";OFS=":"} $3 > 26 {print $1,$3}'

OUTPUT:

jack:28

END模块

当所有记录都处理完了后就会执行END模块的代码,一般用来输出一个结果,比如累加、数组等CMD:

cat data.txt |awk -F"[, ]+" 'BEGIN{sum=0} {sum+=$3} END{print sum/NR}'

OUTPUT:

25.6

awk数组CMD:

echo |awk 'BEGIN{arr["a"]="aa";arr["b"]="bb";arr["c"]="cc"}END{for (key in arr) {print(arr[key])}}'

OUTPUT:

aa

bb

cc

awk中的任何变量都不需要申明,直接使用即可

实例

一个自动登录程序

数据如下:1 machine1 username1 host1 password1

2 machine2 username2 host2 password2

3 machine3 username3 host3 password3#!/bin/sh

PASSFILE="./passwd.data"

key=$1

cat $PASSFILE| awk -F"[t ]+" '$0 ~ /'"$key"'/ {print $1,$2,$3,$4}'

printf "please choose one: "

read choose

if [[ "$choose" != "" && $choose -ge 0 ]]

then

eval $(cat $PASSFILE| awk -F"[t ]+" '$1 == '"$choose"' {printf("arr=([1]=%s [2]=%s [3]=%s)",$3,$4,$5)}')

user=${arr[1]}

host=${arr[2]}

pass=${arr[3]}

# 结合expect实现自动登录

echo "ssh ${user}@${host} < ${pass}"

fi

统计文件单词出现次数sed -r 's#[^a-zA-Z]+# #g' data.txt |awk 'BEGIN{RS="[ tn]+"} {print $0}' |sort |uniq -c |sort -n

统计与本机建立连接的ip机器连接数netstat -an |grep ESTABLISHED |awk '{print $5}' |awk -F: '{print $1}' |sort |uniq -c |sort -nr

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值