从一大组文件中提取某些文本行

从一大组文件中提取某些文本行

我试图从一大组文本文件中提取所有单独的 Unix 命令。

这是我到目前为止所拥有的:

在此示例中,我将提取该tx命令的所有实例。一大堆文本文档都放在里面/PROJECT/DOCS ,它们都被命名了whatever.EXT

#!/bin/bash

rm -f ~/Documents/proc-search.txt 

cd /PROJECT/DOCS

for file in *

do
 echo "PROC Name: "$file >> ~/Documents/proc-search.txt
 echo "Description:" >> ~/Documents/proc-search.txt
 awk 'NR==1' $file >> ~/Documents/proc-search.txt
 echo "UNIX Commands:" >> ~/Documents/proc-search.txt
 awk '/tx/{print}' $file >> ~/Documents/proc-search.txt
 echo "########################################" >> ~/Documents/proc-search.txt

done

我打开 proc-search.txt 并感到非常兴奋,因为它确实捕获了该tx命令的所有实例。但它也输出我不想要的文件的信息,因为它们不包含该tx命令。就像ACPFM.EXT下面的例子一样。有什么办法可以让它排除领域没有的文件tx

这是我得到的输出,名为 proc-search.txt。它看起来不错,除了我不想看到任何有关ACPFM.EXT、 或 或任何其他不使用该tx命令的 .EXT 的报告。

PROC Name: 17.EXT
Description:
* NORMPARD (EDIT CONTRL FILE)
UNIX Commands:
# tx @CONTRL                                    <- YAY!  This is a result that I want.
########################################
PROC Name: ACPFM.EXT                            <- I don't want this stanza.
Description:
* ACPFM (Account PARameter File Maintenance)
UNIX Commands:
########################################
PROC Name: ACTDARA.EXT
Description:
*
UNIX Commands:
#tx @SEQFILE                                    <- YAY!  This is a result that I want.
########################################
PROC Name: ACTEDIT.EXT
Description:
*
UNIX Commands:
#tx @SEQFILE                                    <- YAY!  This is a result that I want.
########################################

答案1

你的(删节的)循环

for file in *
do
 echo "PROC Name: "$file >> ~/Documents/proc-search.txt

 awk '/tx/{print}' $file >> ~/Documents/proc-search.txt
 
done

将打印"PROC Name: foo"所有文件,并且awk仅打印tx匹配的行。

也许你想要(假设没有目录匹配 * )

for file in $(grep -l tx *)

这样循环中的所有文件都会有tx字符串。

答案2

听起来你所需要的只是:

#!/usr/bin/env bash

cd /PROJECT/DOCS &&
awk '
    FNR==1 {
        desc = $0
        doneHdr = 0
    }
    /tx/ {
        if ( !doneHdr++ ) {
            printf "%s", sep
            sep = "########################################" ORS
            print "PROC Name:", FILENAME
            print "Description:" ORS desc
            print "UNIX Commands:"
        }
        print
    }
    END {
        printf "%s", sep
    }
' * > ~/Documents/proc-search.txt

但没有样本输入和预期输出,这只是未经测试的猜测。

答案3

Archemar 的想法是正确的,但(在我看来)方法错误。我想简单说一下:

#!/bin/bash

command_name=tx                 # or use "$1" if you want to be able to pass this as an arg

cd /PROJECT/DOCS  &&
for file in *
do
    if grep -q "$command_name" "$file"
    then
        echo "PROC Name: $file"
        echo "Description:"
        head -n1 "$file"
        echo "UNIX Commands:"
        grep "$command_name" "$file"
        echo "########################################"
    fi
done  > ~/Documents/proc-search.txt

相关内容