因此,我必须查看通过电子邮件发送给我的日志(在 Windows 中),搜索一行来确定型号的序列号,我想一个简单的方法是编写一个丑陋的批处理脚本来转换 .msg,以便我可以读取该文件。例如:
cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt
这样我就剩下 3 个唯一的数字,我该如何将 ALPHA 添加到第 1 行、将 BETA 添加到第 2 行以及将 GAMMA 添加到第 3 行,并使用空格或 : 作为分隔符?
更新:该文件a21s.txt
类似于
0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414
答案1
有很多方法可以完成您要搜索的内容,仅举几个例子。
awk
以及量身定制的解决方案
针对您的示例量身定制的一个解决方案是使用awk
并向其传递 3 个变量。这并不通用,因为如果您有 4 行,则必须传递 4 个变量,依此类推...
该命令有一种简单的方法,可以通过列号( ,...最后一个) awk
来管理列。$1
$2
$NF
为了让这里的阅读更加简单,我使用了你的旧中间文件
a21s.txt
awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" ' NR==1 {print s1,$7} ; NR==2 {print s2,$7} ; NR==3 {print s3,$7} ; ' a21s.txt
- 在第一行中,您
awk
使用选项传递 3 个变量-v
。 - 在以下几行中,您使用内部变量天然橡胶,保持行数的计数。因此,你去打印变量s1,只有当你有第一行时,s2与第二个...等等。
- 在最后一行之后,
'
您可以指定文件名,这样您就不需要调用该cat
过程并将其传送到该awk
过程。 - 如果变量(ALPHA、BETA……)可以通过某种机制生成(例如“Serial01、Serial02”),则可以将其放置在行号和外部变量上的控件上。
- 在第一行中,您
实用说明:在 *nix 下你可以命令序列将一个输出通过管道 (
|
) 传输到以下输出,无需创建中间文件。
因此,在您的示例中,您可以直接使用:cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
在这种情况下,
cut
您可以使用awk
命令cat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt
。
更通用的解决方案paste
:awk
假设您有一个a21s.txt
文件和另一个文件(b.txt
),它们的行数相同,并且包含您想要添加前缀的字符串(每个单词)(如下所示)。
ALPHA
BETA
GAMMA
你可以简单地使用
paste b.txt a21.txt | awk '{print $1,$8}' > Air21Serials.txt
请注意,现在您的序列号列是第 8 列,因为您之前已通过粘贴添加了另一个列。
笔记
man awk
向 Linux本身询问更多信息man paste
:-)
答案2
回声 ALPHA>agrep.txt ; 猫“预.msg”|字符串2>>删除文件
这可能不是确切的路线。概念是,你第一的想要将单词“Alpha”放入文件中。使用 > 符号创建文件,使用 >> 附加到文件。如果没有“换行符”,则应该将单词 ALPHA 放入其中,然后附加第一条消息。
您可能需要玩一会儿才能使代码正常工作。
编辑:搜索发现使用猫和printf是比 echo 更好的选择,因为 echo 可能会因操作系统的不同而不同
例如:cat ("ALPHA: ") > agrep.txt ; cat "预.msg”|字符串2>>删除文件
对于执行“一行”命令,第一个管道应该是 ; 或 &&
; 命令之间总是执行下一个命令 && 命令之间只有前一个命令成功时才执行下一个命令 并且 || (双管道)只有前一个命令失败时才执行下一个命令
答案3
我不确定strings2
你的输入是什么,所以我不能 100% 确定这会按预期工作。但也许它至少会为你指明正确的方向。cat
可以接受来自 stdin 的输入。所以,你也可以这样做
echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt