使用awk命令在一行中编辑多个列?

时间:2019-03-29 13:03:50

标签: 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::::::

2 个答案:

答案 0 :(得分:2)

您可以使用

# 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

请参见online awk demo

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

答案 1 :(得分:1)

您可以使用块{}为if条件创建多个语句。

forEach()

您还可以使用awk的默认“工作流程”:awk -F':' 'OFS=":" { if ($1 == "root1") {$2="test"; $3="test2";} print}' file.copy>file 来改进命令。为此,您需要将OFS带入输入变量(-v标志)

condition{commands}