使用shell脚本或gawk从字符串中提取pcap名称

时间:2012-06-05 07:05:50

标签: shell awk gawk

我有一个文件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

它不起作用。任何人都可以告诉我如何做到这一点。 任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:2)

它无效的原因是您在gawk命令上错误地使用了变量名称。实际上,它试图处理一个名为“pcappath”的文件。变量传递参数使变量可用 in 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循环完成后变量保留其值。

-r的{​​{1}}选项几乎总是应该使用。这会导致read逐字接受反斜杠。

使用read代替(()),因为它更灵活。

使用参数扩展来提取基名。

您的let(大概)需要换行。

答案 1 :(得分:1)

使用basename命令很容易:

cat $PCAP_LIST | while read PCAP_PATH ; do basename "$PCAP_PATH" ; done