shell - 使用 awk 命令编辑一行中的多个列?
问题描述
如果第 1 列中的值等于特定字符串,我正在尝试编辑文件中的 3 列。这是我目前的尝试:
cp file file.copy
awk -F':' 'OFS=":" { if ($1 == "root1") $2="test"; print}' file.copy>file
rm file.copy
我只能让 awk 命令在更改一列的情况下工作,我也希望能够编辑 $3 和 $8。这可能在同一个命令中吗?还是只能使用单独的 awk 命令或同时使用不同的命令?
编辑说明:我将变量传递给列的真正命令,即 $2=$var
它将用于编辑 /etc/passwd 文件,示例输入/输出:
root:$6$fR7Vrjyp$irnF38R/htMSuk0efLSnAten/epf.5v7gfs0q.NcjKcFPeJmB/4TnnmgaAoTUE9.n4p4UyWOgFwB1guJau8AL.:17976::::::
解决方案
您可以使用
# Fake sample values
v1=pass1
v2=pass2
awk -v var1="$v1" -v var2="$v2" 'BEGIN{FS=OFS=":"} $1 == "root1" { $2 = var1; $3 = var2}1' file > tmp && mv tmp file
查看在线awk
演示:
s="root1:xxxx:yyyy
root11:xxxx:yyyy
root1:zzzz:cccc"
v1=pass1
v2=pass2
awk -v var1="$v1" -v var2="$v2" 'BEGIN{FS=OFS=":"} $1 == "root1" { $2 = var1; $3 = var2}1' <<< "$s"
输出:
root1:pass1:pass2
root11:xxxx:yyyy
root1:pass1:pass2
笔记:
-v var1="$v1" -v var2="$v2"
在 awk 命令中传递您需要使用的变量BEGIN{FS=OFS=":"}
设置字段分隔符$1 == "root1"
检查字段 1 是否等于某个值{ $2 = var1; $3 = var2 }
设置字段 2 和 3 的值1
调用默认print
命令file > tmp && mv tmp file
帮助您“缩小”“类似替换”的代码。
推荐阅读
- android - 为什么我的寻呼机适配器不显示任何内容?
- locust - 蝗虫-如何传递不同的主机地址
- batch-file - 有没有办法从批处理文件中制作混淆的批处理文件?
- opengl - 顶点缓冲区绑定索引和统一缓冲区绑定点?
- python - 为什么我的程序会被评论干扰?
- amazon-web-services - AWS CDK:将 SecurityGroup 构造与 CfnVpc 一起使用?
- excel - Google 表格相当于对转置进行排序但适用于 Excel?还是替代方案?
- javascript - 从套接字接收消息时Vue.js数据不更新
- android - 更改屏幕方向时部分布局未更改
- api - Discord Rest Api Bot,读取用户在特定公会中的角色