我正在尝试编写一个 bash 脚本来轮询 btmon 以获取设备连接。我有一个可行的解决方案,但它慢得离谱,而且问题似乎是 grep 在找到匹配项后退出非常慢(大约 25 秒)。我能做些什么来加速grep或完全避免使用它?
#!/bin/bash
COUNTER=0
while :
do
until btmon | grep -m 1 '@ Device Connected'
do :
done
let COUNTER=COUNTER+1
echo on 0 | cec-client RPI -s -d 1
sleep 5
echo as | cec-client RPI -s -d 1
until btmon | grep -m 1 '@ Device Disconnected'
do :
done
let COUNTER=COUNTER-1
if [ $COUNTER -eq 0 ];
then echo standby 0 | cec-client RPI -s -d 1;
fi …Run Code Online (Sandbox Code Playgroud) 我有一个包含 ~1M 文件的目录,需要搜索特定的模式。我知道如何对所有文件执行此操作:
find /path/ -exec grep -H -m 1 'pattern' \{\} \;
Run Code Online (Sandbox Code Playgroud)
不需要完整输出(太慢)。几个第一次点击是可以的,所以我试图限制行数:
find /path/ -exec grep -H -m 1 'pattern' \{\} \; | head -n 5
Run Code Online (Sandbox Code Playgroud)
这导致 5 行,然后是
find: `grep' terminated by signal 13
Run Code Online (Sandbox Code Playgroud)
并find继续工作。这很好解释here。我尝试了quit行动:
find /path/ -exec grep -H -m 1 'pattern' \{\} \; -quit
Run Code Online (Sandbox Code Playgroud)
这仅输出第一个匹配项。
是否可以使用特定数量的结果来限制 find 输出(例如提供quit类似于的参数head -n)?
我想观看一个文件,直到出现一些文字
我找到了这个答案:`tail -f`直到看到文字
但是当我在 ubuntu 上尝试时,它没有退出:
$ echo one > test.txt
$ echo two >> test.txt
$ echo three >> test.txt
$ echo four >> test.txt
$ cat test.txt | sed '/w/ q'
one
two
$
Run Code Online (Sandbox Code Playgroud)
按预期工作。但是当我尝试拖尾文件时
$ tail -f test.txt | sed '/w/ q'
one
two
Run Code Online (Sandbox Code Playgroud)
它永远不会退出。即使管道破裂,尾巴也不会停止。
有人知道tail退出时如何sed退出吗?
我正在使用一种特殊的方式,可以让我访问谷歌。现在的页面有很大不同...所以我可以正常编辑问题并评论答案。我删除了更多早期的讨论并进入正题。
当找到脚本执行下一个命令的关键字时,我想停止拖尾并返回 0。如果一分钟后没有找到关键字,整个脚本将停止并返回错误代码。我正在使用,set -euxo pipefail这是必要的。
timeout 1m tail -Fn 0 --pid=$(ps -ef | grep "sed /$keywords" | grep -v grep | awk '{print $2}') $log_file | sed "/$keywords/q"
Run Code Online (Sandbox Code Playgroud)
我之前使用的上面的命令在我测试时接缝正常。但在 Jenkins 中,当找到关键字时,有时它会返回“构建步骤‘执行 shell’将构建标记为失败”。
我手动重启程序后找到了原因。它返回代码141。所以我查找了代码,发现它与http://www.pixelbeat.org/programming/sigpipe_handling.html中的tail -f管道相关。|
为了我的目的,我修改了其他问题中的命令。看起来一切都很好,只是“tail -Fn 0 balabala.log”仍然留在后台,几分钟后就消失了。但它距离目标最近。
{ sed /"$keywords"/q; kill -13 $!; } < <(exec timeout 1m tail -Fn 0 $log_file)
Run Code Online (Sandbox Code Playgroud)
这超出了我的理解范围...我查阅了用法但仍然感到不确定。
- 我改为
kill -s PIPE "$!"缩短kill -13 $!脚本。- 我仍然对 的用法感到困惑
{ } < <()。它们对我来说就像陌生的词......- 可以
exec …