我有一个文件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
它不起作用。任何人都可以告诉我如何做到这一点。 任何帮助将不胜感激。感谢。
答案 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