我有一个名为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
答案 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"