【问题标题】:Bash, Netcat, Pipes, perlBash、Netcat、管道、perl
【发布时间】:2014-03-02 18:36:28
【问题描述】:

背景:我有一个相当简单的bash 脚本,我用它来生成CSV 日志文件。作为该 bash 脚本的一部分,我使用netcat 轮询我网络上的其他设备。 netcat 命令返回一个信息流,我可以将其通过管道传送到 grep 命令中,以获取我在 CSV 文件中需要的某些值。我将返回值从grep 保存到bash 变量中,然后在脚本结束时,我将所有保存的bash 变量写到CSV 文件中。 (很简单。)

我想做的改变是我必须为每条要保存的信息发出的netcat 命令的数量。对于每个发出的netcat 命令,我都会返回所有可能的值(因此每次都返回相同的数据并且对网络来说是负担)。所以,我想只使用一次netcat 并根据需要多次解析返回值来创建bash 变量,这些变量以后可以连接在一起成为CSV 文件中的单个记录我是创造。

具体问题:如果我将netcat 命令的输出传递给使用> 的文件(相对于当前的grepmethod),则使用bash 语法我得到一个文件每个条目都在自己的行上(大概用 \n 作为 EOL 记录分隔符分隔——对于 perl 正则表达式很容易)。但是,如果我将netcat 的输出直接保存到bash 变量中,并回显该变量,则所有数据都混杂在一起,因此解析起来很麻烦(不是那么容易)。

我玩过两种选择:首先,我认为 perl 单行可能是一个很好的解决方案,但我不确定如何最好地执行它。伪代码可能是将netcat 输出保存到一个bash 变量,然后以某种方式找出如何用perl 解析它(虽然不是直截了当)。

第二种选择是使用bash> 并将netcat 的输出发送到一个文件。这将很容易使用perl 和正则表达式(给定\n EOL)来处理,但这需要打开一个外部文件并将其传递给perl 脚本进行处理,然后以某种方式将其返回值传递回bash 脚本作为bash 变量用于进入CSV 文件。

我知道我在这里遗漏了一些简单的东西。有没有办法可以强制从netcat 进入bash 变量的换行符,然后针对该变量重复运行一个perl-one 衬里来创建我需要的每个CSV 变量——都在同一个@ 987654357@ 脚本?抱歉,问题很长。

【问题讨论】:

  • 字太多,代码不够
  • 我打赌你能写出一个具体问题 as一个具体问题 -- 一句话,或者二。另外,向我们展示一些代码、输入和输出,并指出你的方法出了什么问题。
  • 你们在抱怨太多的词和没有足够的代码......不要再偷懒了。 secJ 试图尽可能详细地说明他的问题。

标签: regex perl bash csv pipe


【解决方案1】:

第二个选项是使用 bash 的 > 并将 netcat 的输出发送到 一份文件。这将很容易使用 perl 和 Regex 来处理,因为 \n EOL,但这需要打开一个外部文件并将其传递给 用于处理的 perl 脚本,然后以某种方式传递其返回值 回到 bash 脚本,作为 bash 变量进入 CSV 文件。

这实际上是一个相当常见的习惯用法:将 netcat 的输出保存在 一个临时文件,然后使用 grep 或 awk 或 perl 或 what-have-you as 根据需要多次从该文件中提取数据:

# create a temporary file and arrange to have it 
# deleted when the script exists.
tmpfile=$(mktemp tmpXXXXXX)
trap "rm -f $tmpfile" EXIT

# dump data from netcat into the
# temporary file.
nc somehost someport > $tmpfile

# extract some information into variable `myvar`
myvar=$(awk '/something/ {print $4}' $tmpfile)

最后一行演示了如何将某些内容(在本例中为awk 脚本)的输出转换为变量。如果你使用 perl 来提取一些信息,你可以做同样的事情。

您也可以只用 perl 编写整个脚本,这可能会让您的生活更轻松。

【讨论】:

  • 谢谢!最后一行正是我想要得到的。我知道必须有更简单的方法。我同意将整个脚本转换为 perl。我现在正在转换它,但我需要在生产端进行临时修复。我目前在while循环中运行脚本,所以它本身不会退出,但我应该能够在每次循环后轻松地在脚本中删除临时文件,然后在下一次重新创建它。再次感谢!
猜你喜欢
  • 2012-08-23
  • 2012-08-09
  • 2023-03-26
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2013-09-25
相关资源
最近更新 更多