我有一个包含以下内容的文件(a.txt):
Redhat master 12345678 V1A 20.0/20.0.1
Windows slave 12345678 V1B 19.0/19.0.1
我想用“master”一词来 grep 行,并用新值替换第四个和第五个字段。
例如,新的 a.txt 可能是:
Redhat master 12345678 V1B 20.0/20.0.2
Windows slave 12345678 V1B 19.0/19.0.1
这里“V1A”被替换为“V1B”,“20.0/20.0.1”被替换为“20.0/20.0.2”
有人可以帮助实现这一目标吗?
我还想传递新值作为脚本参数:
我可以将新值作为参数传递给脚本吗?我正在尝试下面的脚本:
脚本(test.sh)内容如下:
#!/bin/bash
if [ "$2" == "" ]; then
echo usage: $0 \<version\> \<revision\>
exit -1
else
version=$1
revision=$2
fi
awk '/master/{$4="$1";$5="$2"}' a.txt >newa.txt
当我跑步时:
#bash test.sh V1B 20.0/20.0.2
它不起作用。
答案1
和awk
:
awk '/master/{$4="V1B";$5="20.0/20.0.2"};1' a.txt
首先,我们搜索包含单词“master”的行,然后替换第 4 个 ( ) 和第 5 个 ( ) 字段/master/
中的值。最终只是打印所有内容。$4
$5
1
编辑:
要将新值作为参数传递,您需要使用-v
switch in awk
,例如:
x="V1B"
y="20.0/20.0.2"
awk -v VAR1="$x" -v VAR2="$y" '/master/{$4=VAR1;$5=VAR2};1' a.txt
(但请注意,如果这些变量包含反斜杠,它将无法正常工作)。
答案2
在行中
awk '/master/{$4="$1";$5="$2"}' a.txt >newa.txt
“$1”不保存从 shell 传递的值。
你应该写
awk '/master/{$4="'$1'";$5="'$2'"}' a.txt > newa.txt
这样 $1 frm 调用 shell 就会被放入 awk 文件中。