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

时间:2017-08-14 00:08:53

标签: bash loops sed while-loop grep

我们正在尝试制作一份报告,其中包含hosts.txt文件和infile。它应该在找到包含文本host1的行上方的第一个host1时生成标题,然后在刚刚创建的标题行下面添加一个新行,使所有其他文本保持原样并继续为hosts1执行-30。

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

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

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

infile文件:所有文本都是文字的 - 随机文本是完全随机的。 除了找到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

我们现在使用我们的手册sedgrep添加标题 - 当前的工作方式:

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来查找host1host2上面使用的grep命令的字符串。 outfile4的内容:

 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文件的外观:我们的单个手册sed&amp; grep命令为我们做了:

 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

1 个答案:

答案 0 :(得分:0)

$ 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语句依赖于“any - -random-text中没有[。] $匹配。如果有可能这将在你的infile中,那么更明确的模式匹配需要。