1

たとえば、いくつかのpcapファイルのパスを含むファイルpcap_listがあります。

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

これから、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

動作していません。誰かが私にそれを行う方法を教えてもらえますか?どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

2

gawk機能しない理由は、コマンドで変数名を間違って使用しているためです。そのまま、文字通り「pcappath」と呼ばれるファイルを処理しようとしています。引数を渡す変数は、ファイル名の引数としてではなく、スクリプト内で変数を使用できるようにします。gawk

あなたの質問では、「それは機能していません」と言っていますが、その方法やエラーメッセージを含めていません。持っている場合は、問題の内容に関する情報が得られる可能性があります。

とにかく、問題を解決するのは簡単です。

basenameMechanical snail が提案するように使用するか、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利点の 1 つは、これによりサブシェルの作成が回避されるため、whileループが完了した後も変数の値が保持されることです。

-rオプションは、readほとんど常に使用する必要があります。これによりread、バックスラッシュを文字通り受け入れるようになります。

より柔軟なので(())代わりに使用してください。let

パラメーター展開を使用してベース名を抽出します。

あなたのprintf(おそらく)改行が必要でした。

于 2012-06-05T08:11:13.440 に答える
1

basenameこれは、次のコマンドを使用して簡単に実行できます。

cat $PCAP_LIST | while read PCAP_PATH ; do basename "$PCAP_PATH" ; done
于 2012-06-05T07:25:41.700 に答える