2012-06-05 96 views
1

我有一個文件pcap_list,其中包含例如幾個pcap文件的路徑。使用shell腳本或gawk從字符串中提取pcap名稱

./folder1/folder2/...../foldern/sample1.pcap 
./folder1/folder2/...../foldern/sample2.pcap and so on.... 

從這我想提取使用shell腳本在linux中的pcap文件的名稱。任何人都可以讓我知道我該怎麼做。雖然當我用 gawk'BEGIN {FS =「/」} {print $ NF}'pcap_list 它工作正常。但我想在循環中完成此操作,併爲此編寫了以下腳本。

#!/bin/bash 
PCAP_LIST=$1 
count=0 
cat $PCAP_LIST | while read PCAP_PATH 
do 
     let count++ 
     echo "$count $PCAP_PATH" 
pcapname=($(gawk -v pcappath=$PCAP_PATH 'BEGIN {FS = "/"} {print $NF}' pcappath)) 
printf "pcapname =$pcapname" 
done 

它不工作。任何人都可以讓我知道我該怎麼做。 任何幫助將不勝感激。謝謝。

+0

UUOC:while read PCAP_PATH;做...完成<$ PCAP_LIST –

回答

2

它不工作的原因是你沒有正確地使用你的gawk命令變量名。事實上,它試圖處理一個叫做「pcappath」的文件。變量傳遞參數使變量可用內部gawk腳本,而不是作爲文件名參數。

在你的問題中,你說「它不工作」,但你沒有說如何或包括任何錯誤信息。如果有的話,它可能會提供有關問題的信息。

無論如何,解決問題很簡單。您可以使用basename作爲機械蝸牛建議,或者您可以修復您的gawk版本(我在下面顯示),或者您可以使用純Bash版本(我在下面顯示)。

pcapname=$(echo "$PCAP_PATH" | gawk 'BEGIN {FS = "/"} {print $NF}') 

另外,沒有理由使用額外的圓括號來創建數組。

下面是一個純粹的Bash版本:

#!/bin/bash 
pcap_list=$1 
count=0 
while read -r pcap_path 
do 
    ((count++)) 
    echo "$count $PCAP_PATH" 
    pcapname=${pcappath##*/} 
    printf '%s\n' "pcapname = $pcapname" 
done < "$pcap_list" 

你應該習慣,以減少與外殼或環境變量名稱衝突的機會使用小寫或混合大小寫變量名。

不要使用cat這個應用程序 - 只需將文件重定向到done語句。一個好處是,這樣可以避免創建一個子shell,以便在完成while循環後變量保留它們的值。

應該幾乎總是使用-r選項read。這導致read從字面上接受反斜槓。

使用(())而不是let,因爲它更靈活。

使用參數擴展來提取基準名稱。

你的printf(大概)需要一個換行符。

+0

+1總是喜歡閱讀你的答案 –

1

這是很容易使用basename命令:

cat $PCAP_LIST | while read PCAP_PATH ; do basename "$PCAP_PATH" ; done 
相關問題