awk在linux shell中的常见用法
一、awk 导入文件到数组
类似 python 中 readlines();
awk '{print $0}' filename
执行结果:
arr=($(awk '{print $0}' filename));
执行结果:
遍历数组
for i in ${arr[*]}
do
echo $i;
done
执行结果:
二、awk 操作某字符串,类似python 中 split 的操作。
1、password=123,我要将这个字符串使用 = 切割,并且获取密码的内容 123.
使用 -F 指定分割的字符,使用 -v 传递参数。
‘’ 使用这个 引用代码块
{} 里面放执行的代码块。
print 就是打印,printf 就是按照格式打印。
echo "password=123" | awk -F '=' -v i=2 '{len=split($0,ta,"="); print ta[i]}'
执行结果:
2、a=123,b=456,c=789 我要把这个字符串使用,分开,并且获取第N个值,这里N=2
echo "a=123,b=456,c=789" | awk -F ',' -v i=2 '{len=split($0,ta,","); print ta[i]}'
执行结果:
3、 b=456 ,我要把这个字符串b=456改成b=666
echo "b=456," | awk -v var="666" '{len=split($0,ta,"="); ta[2]=var;printf("%s=%s\n",ta[1],ta[2])}'
执行结果:
三、awk 的正则匹配。
例子文本如下:
1、我想匹配ren开头的行,
如果匹配成功,打印这一行。
如果匹配不成功,打印错误。
#!/bin/sh
file_name="test.txt";
awk -F '=' ' \
{ \
if($1~/ren.*/) \
{ \
print $0\
} \
else \
{ \
print "error" \
} \
}\
' $file_name
awk -F '=' 表示使用 = 分割。
if($1~/ren.*/)
$1 表示匹配分割后 的第一个变量。这里就是 renyj/hello/code 这三个。
~ 正则匹配操作符。后面//两个斜杠中间就是正则匹配表达式
// 这两个斜杠之间是正则表达式。
ren.* 表示ren开头的任意字符正则表达式。
print 打印
$0 就是值awk导入的某一行
执行结果:
2、还是这个例子,我想匹配不是 ren 开头的
#!/bin/sh
file_name="test.txt";
#匹配不是ren开头的,只需要在前面加上 !就可以。
awk -F '=' ' \
{ \
if($1!~/ren.*/) \
{ \
print $0\
} \
else \
{ \
print "error" \
} \
}\
' $file_name
执行结果,刚好和刚倒过来。只有第一行打印错误,其它都正常打印。
3、还是这个例子,我想匹配ren开头的一行,然后renyj=123 改成 renyj=456
#!/bin/sh
file_name="test.txt";
awk -F '=' ' \
{ \
if($1~/ren.*/) \
{ \
new_value="456";\
printf("%s=%s\n",$1,new_value) \
} \
else \
{ \
print $0 \
} \
}\
' $file_name
执行结果:
这里注意的是在awk 的代码块中,value被赋值之后,不用$也能直接用。
四、awk调用shell命令
可以使用getline 来调用shell中的其它命令
参考博客:
http://blog.sina.com.cn/s/blog_3ef3b17a0100dzw0.html
我想用 name.text中的 renyj=233 替换 test.txt 中的 renyj=1
awk -F '=' -v file="$file_name" '\
{ \
if($1~/ren.*/) \
{ \
line_name=$1; \
new_line=$0; \
while(("sed -i '/\""line_name"\"/s/\""line_name"\"=.*/\""new_line"\"/' "file"" | getline line)>0) \
{ \
printf("%s\n",$0) \
}\
close("sed -i '/\""line_name"\"/s/\""line_name"\"=.*/\""new_line"\"/' "file""); \
} \
else \
{ \
print $0 \
} \
}\
' $name_list
执行结果: