对于文件中的每一行执行命令同步并保存到另一个文件的换行符

时间:2014-12-04 19:42:31

标签: linux bash perl text line-by-line

我有一个名为wget的{​​{1}}脚本 - 此脚本采用如下命令

Chktitle.sh

然后我有一个文件名$ Chktitle.sh "my url" ,其中包含超过100行的网址和网址,用于检查网页标题。 然后我将url.txt作为空白文件。

有没有办法可以对文件中的每一行执行如下所示的重复操作:

results.txt

我需要确保它只会在上一行完成之后执行下一行。 任何人都能告诉我任何简单的方法吗?我很高兴使用Perl,sh,并考虑其他语言..

Grab line1 from url.txt ----- then execute Chktitle.sh "line1" ----- Now save the result for line1 in results.txt ----- Now goto Line2 ........ etc etc etc 的内容:

chktitle.sh

4 个答案:

答案 0 :(得分:2)

也许这样的事情可以帮助(只要我理解正确):

while read line; do
    /path/to/Chktitle.sh x"$line" >> results.txt;
done < /path/to/input.txt

对于/path/to/input.txt中的每一行,执行您的脚本并将输出(>>)附加到results.txt

当然,您总是可以在while循环中添加其他语句:

while read line; do
    # Initialise var to output of chktitle
    var=$(/path/to/Chktitle.sh x"$line");

    # Add conditions
    if [ "$var" = "google" ]; then
        echo "google" >> result.txt;
    else
        echo "not google" >> result.txt;
    fi
done < /path/to/input.txt

答案 1 :(得分:0)

以下是在Perl中执行此操作的方法:

use warnings;
use strict;
use LWP::Simple;

my $inputFile = 'url.txt';
open (my $fh, '<', $inputFile) or die "Could not open file '$inputFile': $!\n";
while (<$fh>) {
    my $url=chomp;
    my $str=get($url);
    if (! defined $str) {
        warn "Could not find page '$url'\n";
        next;
    }
    my ($title)=$str=~ m{<title>(.*?)</title>}s;
    if (! defined $title) {
        warn "No title in document '$url'\n";
        next;
    }
    print "$title\n";
}
close ($fh);

答案 2 :(得分:0)

cat url.txt | xargs -I{} ./Chktitle.sh {} >> results.txt

请参阅xargs,尤其是-I切换。

xargs调用将逐行读取输入(url.txt),并以每个此类读取行作为参数调用./Chktitle.sh

{}是行读取的占位符。你也可以写

cat url.txt | xargs -Ifoo ./Chktitle.sh foo >> results.txt

foo为占位符)但{}是通常用于xargs的占位符。

答案 3 :(得分:-2)

您可以使用以下两个参数创建脚本

如何在命令行上使用脚本

< script >  < path to url file >    <path to excuting script>

代码细分如下,并附有说明

第1步

#!/bin/bash
 rm -f "/root/Desktop/result.txt 2> /dev/null 

删除任何名为result.txt的文件,以便我可以创建一个新的空白文件

第2步

while read -r my_url; do 
"$2" "$my_url" >> "/root/Desktop/result.txt" 
done < "$1"

设置while do循环以读取url文件中的所有行(称为“$ 1”)。

每行读取都保存为“my_url”。

循环使用脚本脚本(Chktitle.sh - $ 2),然后执行称为“my_url”的行读取,并在命令行上执行它并将输出重定向到result.txt。这是为每一行完成的。

现在让我们将所有代码汇总到一个脚本中

#!/bin/bash
rm -f result.txt 2> /dev/null
while read -r my_url; do
"$2" "$my_url" >> "/root/Desktop/result.txt"
done < "$1"