简短而普遍的问题是:在 Unix/Linux 中,在大型文本文件中查找多个(大约 150 个)字符串的列表的最佳方法是什么?
我向所有 Unix/Linux 专家提出这个问题,作为一个一般性问题,希望我能找到适合我的具体情况的解决方案:我感觉这需要一些修改。
我在 IBM Unix System Services (USS) 机器上有一个很大的文本文件(实际上是 MVS 数据集)——我相信它大约有 6GB。
我还有一个大约 150 个 5 字符标识符的列表,格式为 AAAAA,我需要在这个文件中找到它们——也就是说,我想从文件中提取包含 150 个特定标识符中的任何一个的行。我在寻找。
大文件中每一行的格式为:
00000000000A00000000000000000AAAAA\n
其中 0 代表数字,A 代表字母数字字符。我正在搜索的字符串始终位于行的末尾。
在 USS 中使用数据集似乎有点尴尬,而且我无法将其复制到 Unix 环境中,因为它太大了。标准 Unix 实用程序并不都对数据集进行操作(例如 dd);然而 sed、awk 和 grep 似乎在某种程度上可以工作(尽管命令行开关似乎有点不同)。
我可以按如下方式 grep 数据集:
cat "//'MVS.DATASET'" | grep -e"LOOKFOR1" -e"LOOKFOR2" -e"LOOKFOR3" > output_to_file.txt
但是,它不允许我在一行中 grep 查找所有 150 个项目;我可以将其拆分并运行几次,但我觉得应该有更好的方法。
我尝试使用 sed 脚本如下,但我根本不了解 sed,并且收到一个错误,提示“命令后出现垃圾”。我将以下内容保存在文件 sed-script.txt 中:
s/AAA01/&/p
s/AAA30/&/p
s/AAA10/&/p
... etc ...
然后跑了sed -f sed-script.txt "//'MVS.DATASET'"
同样,此操作失败,并显示“sed:命令后出现 FSUM7294 垃圾”。
那么,1. 在“普通”Unix 环境中通常如何解决这个问题,以及 2. 您对这一特定案例有什么具体的见解吗?
答案1
grep
支持从文件中获取模式-f
,如果还指定固定字符串 ( -F
),效率会更高:
grep -F -f patterns.txt "//'MVS.DATASET'"
答案2
您可以先将 150 个 5 字符字符串的列表存储在一个文件中,然后运行一个循环来查找模式 -
for i in `cat file`
do
cat mvsfile | grep -i $i >> matched_lines
done