-1

我有一个wget名为的脚本Chktitle.sh——这个脚本接受如下命令

$ Chktitle.sh "my url"

然后我有一个超过 100 行的文件名url.txt,其中包含 url 和 ips 来检查网页标题。然后我有results.txt一个空白文件。

有什么方法可以对文件中的每一行执行如下重复操作:

 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

我需要确保它只会在前一行完成后才执行下一行。任何人都可以告诉我任何简单的方法来执行此操作吗?我很高兴使用 Perl、sh 并考虑其他语言。

的内容chktitle.sh

#!/bin/bash
string=$1"/search/"
wget --quiet -O - $string \
| sed -n -e 's!.*<title>\(.*\)</title>.*!\1!p'
4

4 回答 4

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
于 2014-12-04T21:01:10.037 回答
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);
于 2014-12-07T11:40:48.360 回答
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

(with fooas placeholder) 但是{}是通常用于xargs.

于 2017-06-18T16:56:14.390 回答
-2

您可以使用 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"
于 2014-12-04T22:46:21.177 回答