如果列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::::::
答案 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}