查找包含pattern1的文件,其中下一行不包含pattern2

问题描述 投票:0回答:2

我正在尝试搜索明文私钥。简单搜索“BEGIN.*PRIVATE”会返回许多误报,因为许多都以以下格式加密存储:

-----BEGIN ... PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED

所需的输出是包含明文私钥的所有文件名的列表。文件中有多少个,或者每个文件出现的频率,是我之后要处理的问题。

我有一个非常丑陋、脆弱得令人讨厌的解决方案:

for i in $(find temp_git/ -type f) ; do sed -n '/BEGIN.*PRIVATE/ {N ; /ENCRYPTED/!p}' "${i}" | sed -E "s#.*#${i} : Plaintext PK#" | sort -u 2>/dev/null ; done

由于最后一个 sed 语句中引用路径不足,这在各种文件名上都失败了,我不愿意在明显次优的解决方案上投入更多时间。肯定可以用 sed 简洁地做到这一点,但由于未能与 awk 一起破解任何有用的东西,我会对 *awk 解决方案非常感兴趣(使用 awk,我想我也可以在子 shell 中删除 'for i。 ..').

regex shell sed private-key
2个回答
2
投票

Perl 来拯救!

find temp_git -exec perl -lne '
    print $ARGV if /BEGIN.*PRIVATE/ and readline !~ /ENCRYPTED/
' {} +
  • -l
    从 Perl 的输入中删除换行符并将它们添加到
    print
    ;
  • -n
    逐行处理输入,运行每一行的代码;
  • $ARGV
    包含当前打开文件的名称;
  • readline 从文件中读取下一行,
    !~
    否定与
    /ENCRYPTED/
    的匹配。

0
投票

这可能对你有用(GNU sed):

sed -n '/BEGIN.*PRIVATE/{N;/\n.*ENCRYPTED/!F;D}' file 

使用选项

-n
关闭隐式打印。

如果一行包含

BEGIN
,然后是
PRIVATE
,则追加下一行。

如果附加行不包含

ENCRYPTED
,则输出文件名。

© www.soinside.com 2019 - 2024. All rights reserved.