2014-12-04 100 views
-1

我有一個wget腳本命名Chktitle.sh的新行的每一行 - 這個腳本需要像下面對於文件同步執行命令,並保存到另一個文件

$ Chktitle.sh "my url" 

然後我有一個文件名url.txt超過命令100行包含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' 
+0

我想說把整個東西放到一個Perl腳本中會好得多。 (Perl,因爲我比shell更擅長)。什麼在'Chktitle.sh'裏面?它是複雜的嗎? – Borodin 2014-12-05 01:33:08

+0

不,這是不復雜,就像這樣 – 2014-12-06 18:48:46

回答

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 
+0

這看起來像我需要我忘了問也可以做,如果其他情況在你的例子中如果chktitle結果=谷歌保存到結果否則什麼也不做,並移動到下一個網址 – 2014-12-06 18:47:38

+0

@ LeoBishop:編輯。希望有所幫助。 Tbh,還會添加一個測試來驗證結果文件是否存在。 一個好的起點可能是這樣的(對於缺少換行符的抱歉): 'base =「/ tmp」; result =「result.txt」; if [! -d「$ base」];然後 mkdir -p「$ base」;觸摸「$ base/$ result」; fi'或者目錄可能存在,但文件不存在,或者它們都可以存在,並且您想在每次運行時粉碎result.txt,等等。 – masseyb 2014-12-07 09:31:15

+1

在循環外執行重定向會更有效。所以'同時做; ...;完成輸出' – tripleee 2014-12-07 11:17:25

-2

您可以有兩個參數的創建腳本如下

腳本是如何工作命令行

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

的代碼被分解與解釋如下

STEP 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" 
+0

爲什麼要編寫'root'層次結構,爲什麼'root'首先要有'Desktop'?令人不安。 – tripleee 2014-12-07 11:16:01

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); 
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的佔位符。

相關問題