相关疑难解决方法(0)

找到匹配项后,Grep 退出缓慢?

我正在尝试编写一个 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)

grep bash

20
推荐指数
1
解决办法
1586
查看次数

限制查找输出和避免信号 13

我有一个包含 ~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)?

shell grep find signals head

7
推荐指数
1
解决办法
3399
查看次数

使 tail -f 在损坏的管道上退出

我想观看一个文件,直到出现一些文字

我找到了这个答案:`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退出吗?

pipe sed tail

5
推荐指数
1
解决办法
1868
查看次数

tail a log util 关键字发现或超时

我正在使用一种特殊的方式,可以让我访问谷歌。现在的页面有很大不同...所以我可以正常编辑问题并评论答案。我删除了更多早期的讨论并进入正题。

当找到脚本执行下一个命令的关键字时,我想停止拖尾并返回 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)

这超出了我的理解范围...我查阅了用法但仍然感到不确定。

  1. 我改为kill -s PIPE "$!"缩短kill -13 $!脚本。
  2. 我仍然对 的用法感到困惑{ } < <()。它们对我来说就像陌生的词......
  3. 可以exec …

sed tail timeout jenkins

5
推荐指数
1
解决办法
1084
查看次数

标签 统计

grep ×2

sed ×2

tail ×2

bash ×1

find ×1

head ×1

jenkins ×1

pipe ×1

shell ×1

signals ×1

timeout ×1