Bash 从文本文件中提取匹配结果的行

Bash 从文本文件中提取匹配结果的行,bash,shell,awk,grep,Bash,Shell,Awk,Grep,我需要从文本文件中提取文件名,而文本文件上的输出没有字体 从下面的输出文件可以看出,我需要打印出第一个结果之后没有字体的结果?因此,只有最后一个结果在此输出中具有字体 这有意义吗?答案是Grep、Sed还是Awk 所以需要从下面的文本文件中输出,显示在**开始和**结束的PDf中没有字体 ******************START*********************** name type emb

我需要从文本文件中提取文件名,而文本文件上的输出没有字体

从下面的输出文件可以看出,我需要打印出第一个结果之后没有字体的结果?因此,只有最后一个结果在此输出中具有字体

这有意义吗?答案是Grep、Sed还是Awk

所以需要从下面的文本文件中输出,显示在**开始和**结束的PDf中没有字体

******************START***********************
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
/home/user1/Documents/temp1.pdf
******************END***********************
******************START***********************
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
/home/user1/Documents/temp2.pdf
******************END***********************
******************START***********************
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
BAAAAA+TimesNewRomanPS-BoldMT        TrueType          yes yes yes     14  0
CAAAAA+TimesNewRomanPSMT             TrueType          yes yes yes      9  0
/home/user3/Documents/temp file.pdf
******************END***********************

如果前一行以
-
开头,则打印包含“.pdf”的任何行

[me@home]$ awk '{if (st && match($0,".pdf")){print $0}; st=match($0,"^-")}' in.txt
/home/user1/Documents/temp1.pdf
/home/user1/Documents/temp2.pdf
它不是一个通用的解决方案,但可以处理您提供的输入数据。我可以想象在一些边缘情况下,这可能会失败,但这完全取决于输入文件的规范


更新 (根据您在下面评论中发布的脚本)如果您只是想识别没有嵌入字体的PDF文件,这可能会起作用:

MAGNUM="/mnt/network/User\ 1\ PDF\ 06.12.11/"
has_no_fonts() {
    COUNT=$(pdffonts "$1" 2> /dev/null | wc -l)
    exit $(( $COUNT - 4 ))
}
export -f has_no_fonts
find "$MAGNUM" -type f -name "*.pdf" -exec bash -c 'has_no_fonts "{}"' \; -print
下面是脚本的分解:

  • 检测嵌入式字体计数。如果
    pdffonts
    在没有嵌入字体的情况下返回一个特定的值,那么这将很简单,但事实并非如此。因此,我们计算输出行的数量并减去2(标题行)以确定嵌入字体的数量

    COUNT=$(pdffonts "$1" 2> /dev/null | wc -l) # number of output lines
                                                # exactly 2 if no fonts
                                                # exactly 0 if there are errors
    exit $(( $COUNT - 2 ))  # exit 0 (success) if and only if PDF has no fonts
    
  • bash函数已导出,以便可以在子shell中使用

    export -f has_no_fonts
    
  • 找到pdf文件并仅打印出pdf有效且无字体的名称

    find .....  -exec bash -c 'has_no_fonts "{}"' \; -print
                      -------                        -------
                          |                             |
              -exec cannot run bash functions     Will only print 
               so run in a bash subshell       filename if prev command exit with 0
    
如果您喜欢一行,整个脚本可以写成:

find "$MAGNUM" -name "*.pdf" \
    -exec bash -c 'exit $(($(pdffonts "{}" 2> /dev/null |wc -l) - 2))' \; -print

这可能适合您:

sed -n '/^\*/,//{H;/\*END\*/{x;s/\n/&/6;t;s|[^/]*\([^\n]*\).*|\1|p}}' in.txt
/home/user1/Documents/temp1.pdf
/home/user1/Documents/temp2.pdf
说明:

  • 关注以
    *
  • 将此类管线存储在保持空间(HS)中
  • 当我们到达结束分隔符时,交换到HS
  • 检查是否有6行或6行以上的换行符,即必须有字体的条目,如果有,请退出
  • 删除所有非必要的文本并打印出来
  • 或在紧要关头:

    sed -n '/^\*/,//{H;/\*END\*/{x;s|[^/]*-\n\(/[^\n]*\).*|\1|p}}' in.txt
    

    问题解决到什么程度了?只需要包含在*开始和*结束的PDF文件名,这些文件名没有提到任何字体。我现在正在尝试awk,但没有乐趣:-(@Grimlockz你能编辑你的问题,根据你的输入示例添加一个预期的输出吗?你的评论对我来说也不清楚。“没有提到任何字体。”…现在为测试这一点干杯,它似乎起作用了感谢-
    。!/bin/bash SAVEIFS=$IFS IFS=$(echo-en“\n\b”)MAGNUM=/mnt/network/User\1\PDF\06.12.11/对于$中的f(查找$MAGNUM-type f-name“*.PDF”)执行echo“******************************************开始************************************************************”pdffonts$f echo“$f”echo“*********************************************************结束”done>output.txt#restore$IFS IFS=$SAVEIFS
    这是获取PDF信息的脚本,如果helps@Grimlockz很高兴它有帮助。顺便说一句,如果您使用该脚本更新了您的问题,以显示输入文件的来源以及您试图实现的目标,它可能会帮助其他读者。另请参见更新的答案以获取替代解决方案(假设您没有使用
    output.txt
    进行任何其他操作)。非常感谢并注意到,将继续更新-使用新脚本,它看起来很棒,但由于文件夹文件名中的空格,它很难找到文件夹:-(