awk常用方法整理

一、awk 导入文件到数组

类似 python 中 readlines();

awk '{print $0}' filename

执行结果:
awk打印文件每一行

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

文件1

文件2
我想用 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

执行结果:
renyj=1已经被替换成renyj=233

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值