首页 > 解决方案 > 使用 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::::::

标签: shellawk

解决方案


您可以使用

# 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帮助您“缩小”“类似替换”的代码。

推荐阅读