当前位置: 首页 > 面试题库 >

从无尽的烟斗重击中读取

龙霖
2023-03-14
问题内容

我想创建一个脚本,为第一行接收管道的每一行运行另一个脚本。像这样:

journalctl -f | myScript1.sh

myScript1.sh将运行另一个这样的:

./myScript2.sh $line_in_pipe

我发现的问题是,我测试的每个代码都只能在有限的管道中正常运行(直到EOF)。但是,当我通过管道传送类似tail -f或的程序时,它将无法执行。我认为它只是等待EOF执行循环。

编辑:无尽的管道是这样的:

tail -f /var/log/apache2/access.log | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | script_ip_check.sh

所以script_ip_check.sh的想法是这样的:

#!/bin/bash

for line in $(cat); do
        echo "process:$line"
        nmap -sV -p1234 --open -T4 $line | grep 'open' -B3 | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' >> list_of_ip_mapped &
done

对于这种情况下的IP,对于每一行,我都会生成一个nmap线程来扫描该主机上的特殊内容。我将使用它来扫描尝试连接服务器上某些“隐藏”端口的IP。因此,我的脚本必须一直运行,直到我将其取消或它收到EOF。

EDIT2: 我刚刚发现grep刷新了它的缓冲区,所以这就是它不起作用的原因。II用于--line- buffered强制grep输出正在处理的每行。


问题答案:

不知道您的脚本中的内容,我们无法确定地说。

例如,如果您要这样做:

# DON'T DO THIS: Violates http://mywiki.wooledge.org/DontReadLinesWithFor
for line in $(cat); do
  : ...do something with "$line"...
done

…这将等到所有标准输入都可用后,导致您描述的挂起。

但是,如果您遵循最佳实践(按照BashFAQ#1进行操作),则代码将更像这样运行:

while IFS= read -r line; do
  : ...do something with "$line"
done

…并且实际上会正常运行,并 受writer进行的任何缓冲的影响
。有关控制缓冲的提示,请参见BashFAQ#9。

最后,引用DontReadLinesWithFor:

阅读线的最后一个问题for是效率低下。甲while read循环读取在从输入流中一次一行;
$(<afile)一次将整个文件提取到内存中。对于小文件,这不是问题,但是如果您正在读取大文件,则内存需求将非常巨大。(Bash必须分配一个字符串来保存文件,而另一组字符串来保存单词拆分结果…本质上,分配的内存将是输入文件大小的两倍。)

显然,如果内容不确定,则存储要求和完成时间也将相同。



 类似资料:
  • 问题内容: 是否可以在正在运行的nodejs脚本中侦听传入的击键?如果我使用并监听其事件,则输入将被缓冲到下一个换行符,如下所示: 运行此,我得到: 我想要看的是: 我正在寻找一个等效于例如ruby的nodejs 这可能吗? 问题答案: 如果切换到原始模式,则可以通过这种方式实现:

  • 本人江西吉安人,家离井冈山卷烟厂很近,24届毕业生,本科毕业于南昌大学,专业信息管理与信息系统,研究生就读于武汉大学,专业电子信息(计算机技术)。在学历和专业上符合井冈山卷烟厂的信息技术岗招聘要求,本人线上初面正常进行并正常提交。但是,本人最终没法进入笔试,而进入笔试总共有5个人,本人依据官网发布的信息估计后续面试比应该是1:4,最终1人上岸!

  • 无尽的饼干是一款关于饼干制作的模拟年经营游戏,玩法也非常轻松,前期玩家只需要不断点击鼠标来生成饼干,然后随着游戏的推进。 点击开玩 为了制作更多的饼干,玩家可以招募各式各样的饼干制造者来帮助自己完成饼干的生产制作,比如请老奶奶来制作饼干,农场,工厂和异世界的穿越门等等,都可以加大饼干的生产量。          

  • 我已成功地将数据保存在SQLite DB中。但我在从SQLite数据库读取数据时出现了一个错误,然后我的应用程序崩溃了。 错误信息 如果你需要任何其他信息,请告诉我。

  • 我试图加载预填充数据到我的flutter应用程序。我已经在项目的根目录中创建了资产文件夹 在pubspec.yaml中添加了该文件引用 下面是我访问数据库的DBHandler.dart文件代码 我得到的错误是 在代码的给定行下面。 ByteData=等待rootBundle.load(连接('资产',dbName));

  • 无尽的进度条是一款玩法独特另类的休闲类游戏。 在此款游戏中,没有华丽的界面,动人的 BGM,甚至几乎没有什么可以操作的内容。无尽的进度条游戏是一种生活的消遣,可以在你疲惫的时候调节你的心情。