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