对文本逐行进行对应操作,用
awk
可以快速完成
1、 awk
原理及一般用法
简单例子
echo -e "line1\nline2" | awk 'BEGIN { i=1; print "Start"} i==1 { print; i++ } END { print "End"}'
例子解释:
1- 逐行读取
2- 设置i=1
打印"Start"
3- 匹配i==1
是否成立
4- 匹配成功:执行打印该行,然后i加一; 匹配不成功,不执行
5- 读取下一行,重复 3 4
6- 读取结束后 执行 打印 “END”
原理
awk 工作原理
- 首先执行
BEGIN { COMMANDS }
语句块中的语句 ##一般用于变量初始化 - 接着从
文件或stdin
中读取一行,如果能够匹配PATTERN (可以无)
匹配模式可以是正则表达式,条件语句以及范围等 - 执行随后的
{ command }
语块。 ## 如果不提供默认执行{ print }
重复这个过程直到文件全部被读取完毕 - 当读至输入流末尾时,执行
END{ commands }
语句块 ## 像打印所有行的分析结果这种常见任务都在end中实现
2、 awk
中常用的变量
常用变量
NR NF $0 $1 $2
简单例子1
echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | \
awk '{
print "Line no: "NR", No of fieds:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3
}'
""" 解释
读取第一行 显示行号(NR),显示字段数(NF) 显示全部字段($0)逐一显示字段($1 $2 $3)
"""
变量解释
- NR 表示记录编号,当awk将作为记录时,该变量相当于当前行号
- NF 表示字段数量,在处理当前记录时,相当于字段数量。默认的字段分隔符为空格
- $0 该变量包含当前记录的文本内容 # 整行内容
- $1 该变量包含第一个字段的文本内容
- $2 该变量包含第二个字段的文本内容
print $NF 打印一行中最后个字段, $(NF-1) 打印大数第二个字段
简单例子2
awk 'END{ print NR }' test.sh # 看有多少行 NR会自动更新
wc -l test.sh
## 累加的例子
seq 5 | awk 'BEGIN { sum=0; print "Summation:"}
{ print $1"+"; sum+=$1 } END { print "=="; print sum }
'
3、 awk
传入外部参数 & 数组操作 & for
循环
v_name='name'; v_psw='passed_word' # 外部参数
# BEGIN 改变默认分段符号为(:) 设置数组 name -->> passed_word
# 逐行读入数组 $1 -->> $2
# 最后for循环打印数组
echo -e "scc:123456\nylan:asdasd\nsay:qweqwe1" | awk 'BEGIN { FS=":"; name_array[nm]=psw } \
{ name_array[$1]=$2 } \
END { print "====="; print "Finished"; \
for (i in name_array){ print i, name_array[i] } \
}' nm=$v_name psw=$v_psw