从shell脚本更新文件中的计数器

时间:2017-09-18 11:49:40

标签: linux bash awk sed gawk

我有一个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命令进行搜索,更新和替换

3 个答案:

答案 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