1

我有一个文件 pcap_list ,其中包含几个 pcap 文件的路径,例如。

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

从此我想在linux中使用shell脚本提取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脚本中可用,而不是作为文件名参数。

在您的问题中,您说“它不起作用”,但您没有说明如何或包含任何错误消息。如果您有,它可能会提供有关问题所在的信息。

无论如何,解决问题很简单。

您可以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"

您应该习惯性地使用小写或混合大小写的变量名称,以减少名称与 shell 或环境变量发生冲突的机会。

不要cat用于此应用程序 - 只需将文件重定向到done语句中。一个优点是这避免了创建子shell,因此您的变量在while循环完成后保留其值。

应该几乎总是使用选项-rread这导致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 回答