Bash, Netcat, Pipes, perl



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

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

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

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

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

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

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

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

# 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编写整个脚本,这可能会让你的生活更轻松。

相关内容

  • 没有找到相关文章

最新更新