我有一个txt文件,其文件的状态转移到diff远程机器,如下所述
172.31.32.5 yes 2
172.31.32.6 yes 3
现在当另外3个文件被传输到第一台机器时,我希望从shell脚本将文件更新到下面
172.31.32.5 yes 5
172.31.32.6 yes 3
我打算使用像这样的东西
sed -i '/$IP/d' /tmp/fileTrnsfr
echo "$IP yes $((oldcount + newcount))
但是寻找一个更好的解决方案,可以使用sed或awk命令进行搜索,更新和替换
答案 0 :(得分:2)
您可以使用Awk
来实现此目的。您需要将包含IP信息和文件数的变量导入到Awk
的上下文中并进行修改。
temp_file="$(mktemp)"
awk -v ip="$ip" -v count="$newcount" '$1==ip{$NF+=count}1' /tmp/fileTrnsfr > "$temp_file" && mv "$temp_file" /tmp/fileTrnsfr
mktemp
用于创建用于写入Awk
内容的临时名称,并将其移回原始文件名(用于就地文件编辑的模拟)
以上是适用于Awk
的较旧的非GNU变体,不支持就地编辑。
在最新的GNU Awk中(自4.1.0 released起),它可以选择"inplace" file editing:
[...]" inplace"使用新工具构建的扩展可用于模拟GNU"
sed -i
"特征。 [...]
gawk -i inplace -v INPLACE_SUFFIX=.bak -v ip="$ip" -v count="$newcount" '$1==ip{$NF+=count}1' /tmp/fileTrnsfr
答案 1 :(得分:0)
这需要GNU sed:
$ cat fileTrnsfr
172.31.32.5 yes 2
172.31.32.6 yes 3
$ newcount=3
$ ip=172.31.32.5
$ sed -i -r '
/^'"${ip//./\\.}"'/ {
s/(.*) ([[:digit:]]+)/printf "%s %d" "\1" "$(expr \2 + '"$newcount"')"/
e
}
' fileTrnsfr
$ cat fileTrnsfr
172.31.32.5 yes 5
172.31.32.6 yes 3
改变了行
172.31.32.5 yes 2
到
printf "%s %d" "172.31.32.5 yes" "$(expr 2 + 3)"
然后使用e
命令将其作为命令执行(我相信使用/ bin / sh)
答案 2 :(得分:0)
在便携式POSIX shell中完全原生:
#!/bin/sh
# read data from arguments (or else standard input), line by line
cat "${@:-/dev/stdin}" |while read line; do
number="${line##*[^0-9]}" # extract the number at the end of the line
line="${line%$number}" # remove that number from the end of the line
echo "$line$((number+3))" # append (number+3) to the end of the line
done