如何使用 while 循环从文本文件中连续读取文本并将文本参数输出到命令中



我们正在尝试制作一个读取hosts.txt文件和一个infile的报告。当它找到包含文本host1的行上方的第一个host1时,它应该创建一个标题,然后在它刚刚创建的标题行下放置一个新行,保持所有其他文本不变,并继续为 hosts1-30 执行此操作。

目前,我们使用函数中的单个grepsed命令来执行此操作。我们在第一个匹配项上方添加一些标题文本,然后在该标题文本下添加一个空白行。在示例中,我们仅显示 2 个主机host1host2

我们正在寻找一种使用 while 循环而不是单个sed/grep命令来做到这一点的方法。主机在infile中找到时按顺序显示,因此可以在 while 循环中从hosts.txt中按顺序读取。

以下是使用sedgrep命令手动执行此操作的示例。我们有一个输入文件infile.grep/sed语句匹配host1host2,并在上面输入一个标题,在下面输入一个空行。

文件内文件:所有文本都是文字 - 随机文本是完全随机的。 除了找到 host1-30 的行之外,永远不会有 [ ]:

1    any-random-text1 [host1][randomo randomp randomr randomc randomu]
2    any-old-random-text2 randome randomiest randomer randomo randomy randomx randomk randoml randomz
1    some-random-text1 [host2][randomo randomp randomr randomc randomu]
2    any-stupid-random-text2 randome randomiest randomer randomo randomy randomx randomk randoml randomz

这是我们hosts.txt文件:

hosts.txt file:
host1
host2

我们现在使用我们的手动sed添加一个标题,并grep- 当前工作方法:

header="Some Header Text We Need"
header() # I use a function in the example but it can be done without.
{
a=$(grep -n host1 outfile | cut -d : -f 1)
sed $a'i'"**host1_ - ""$header"'' outfile > outfile1
b=$(grep -n host2 outfile1 | cut -d : -f 1)
sed $b'i'"**host2_ - ""$header"'' outfile1 > outfile2
# we need to add a blank line now
a=$(grep -n -w host1 outfile2 | cut -d : -f 1)
sed $a'i\' outfile2 > outfile3
b=$(grep -n -w host2 outfile3 | cut -d : -f 1)
sed $b'i\' outfile3 > outfile4
}

我们的输出文件outfile4正是我们所需要的,这种方法有效,但我们想使用 while 循环来读取hosts.txt以查找 grep 命令上面使用的host1host2字符串。输出文件4的内容:

user@host$ cat outfile4
**host1_ - Some Header Text We Need
1   any-random-text1 [host1][randomo randomp randomr randomc randomu]
2   any-old-random-text2 randome randomiest randomer randomo randomy randomx randomk randoml randomz
**host2_ - Some Header Text We Need
1   some-random-text1 [host2][randomo randomp randomr randomc randomu]
2   any-stupid-random-text2 randome randomiest randomer randomo randomy randomx randomk randoml randomz

相反 - 我们希望能够通过 while 循环来做到这一点:我试过这个,但它不起作用。

date=`date +%Y%m%d`
hosts=hosts.txt
header="Some Header Text We Need"
addheader()
{
while read -r LINE; do
x=$(grep -n "$LINE" outfile | cut -d : -f 1)
sed $x'i'""$LINE_"' - ""$header"''
done < hosts.txt > 2
}
addblankline()
{
while read -r LINE; do
a=$(grep -n -w $LINE outfile | cut -d : -f 1)
sed $a'i\'
done < hosts.txt > 2
}

我们希望我们的 while 循环读取hosts.txt并看起来像output4文件的外观:使用我们的单个手动sedgrep命令为我们所做的:

infile: this should look like outfile4 below:
1   any-random-text1 [host1][randomo randomp randomr randomc randomu]
2   any-old-random-text2 randome randomiest randomer randomo randomy randomx randomk randoml randomz
1   some-random-text1 [host2][randomo randomp randomr randomc randomu]
2   any-stupid-random-text2 randome randomiest randomer randomo randomy randomx randomk randoml randomz

outfile:
user@host$ cat outfile4
**host1_ - Some Header Text We Need
1   any-random-text1 [host1][randomo randomp randomr randomc randomu]
2   any-old-random-text2 randome randomiest randomer randomo randomy randomx randomk randoml randomz
**host2_ - Some Header Text We Need
1   some-random-text1 [host2][randomo randomp randomr randomc randomu]
2   any-stupid-random-text2 randome randomiest randomer randomo randomy randomx randomk randoml randomz
$ cat /tmp/x.sh
#!/bin/sh
input="/tmp/infile.txt"
output="/tmp/outfile4.txt"
hosts="/tmp/hosts.txt"
header="blah blah blah"
for host in $(cat "${hosts}")
do
echo "**${host}_ - ${header}"
echo ""
awk '/[.*]$/{n=0}(/['${host}']$/||n){n++}n' "${input}" | sed 's/^/    /'    
done > "${outfile}"

输入文件:

$ cat /tmp/infile.txt 
1   any-random-text1 [host1]
2   any-old-random-text2
1   some-random-text1 [host2]
2   any-stupid-random-text2
$ cat /tmp/hosts.txt 
host1
host2

输出:

$ /tmp/x.sh
$ cat /tmp/outfile4.txt
**host1_ - blah blah blah
1   any-random-text1 [host1]
2   any-old-random-text2
**host2_ - blah blah blah
1   some-random-text1 [host2]
2   any-stupid-random-text2

awk 语句依赖于没有任何匹配的 [.]$在"任意--随机文本。如果这可能在您的 infile 中,则需要更明确的模式匹配。

最新更新