【问题标题】:bash: perform action (grep) when file changedbash:文件更改时执行操作(grep)
【发布时间】:2017-12-13 19:55:57
【问题描述】:

谷歌搜索了很多,但令人惊讶的是,没有找到可行的解决方案。我是工程师,不是程序员。只需要这个工具。

所以:我有一个文件“test2.dat”,每次更改时我都想对其进行 grep。

我没有安装 inotifywait 或 when-changed 或任何类似的东西,我也无权这样做(我什至不想这样做,因为我希望这个脚本能够普遍工作)。

有什么建议吗?

What I tried:
LTIME='stat -c %Z test2.dat'

while true    
do
   ATIME='stat -c %Z test2.dat'

   if [[ "$ATIME" != "$LTIME" ]]
   then    
       grep -i "15 RT" test2.dat > test_grep2.txt
       LTIME=$ATIME
   fi
   sleep 5
done

但这基本上没有任何作用。

【问题讨论】:

  • 如果你删除-i会发生什么?
  • 谢谢。实际上什么也没有发生。甚至在删除 -i 之前。脚本没有做任何事情,我上面提到的最初的成功一定是偶然的。
  • @Jewenile:为什么单引号内有命令?您是否期望命令运行并将输出存储在变量中。 bash 中的命令替换语法是做$(cmd),所以LTIME=$(stat -c %Z test2.dat) 应该是正确的语句
  • 我认为这就是为什么它执行一次 grep,它进入 if clause,因为它是真的,但是你在 if 中有 LTIME=$ATIME,这就是为什么它没有再次进入 if 子句他们变得平等。要检查是否是这种情况,请在 fi 之后执行 echo
  • Inian:因为我在某个地方发现了。我对 bash 语法了解不多,因为我正在学习。不是程序员。将尝试实施您的提示。编辑:谢谢,它有效! :)

标签: bash file monitor


【解决方案1】:

您的命令替换语法错误。如果您希望命令在引号内运行,那您就错了。 bash 中的command-substitution 语法是$(cmd)

另外,通过 [[ "$ATIME" != "$LTIME" ]] 你正在做一个文字 string 比较,这将 永远 起作用。一旦你存储了LTIME=$ATIME,随后的字符串比较就永远不会正确。

脚本的适当语法应该是,

#!/bin/bash

LTIME=$(stat -c %Z test2.dat)

while true    
do
   ATIME=$(stat -c %Z test2.dat)    
   if [[ "$ATIME" != "$LTIME" ]]
   then    
       grep -i "15 RT" test2.dat > test_grep2.txt
       LTIME="$ATIME"
   fi
   sleep 5
done

我建议在bash 中使用小写字母来定义变量,只需在上面的示例中重新使用您的模板即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 2013-12-14
    • 1970-01-01
    • 2013-02-23
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多