背景:我有一个相当简单的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
的输出发送到文件中。 考虑到n
EOL
,这很容易用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编写整个脚本,这可能会让你的生活更轻松。