我试图从一大组文本文件中提取所有单独的 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