我有一个包含以下条目的文件:
foop07_bar2_20190423152612.zip
foop07_bar1_20190423153115.zip
foop08_bar2_20190423152612.zip
foop08_bar1_20190423153115.zip
其中
foop0* = host
bar* = fp
我想读取文件并创建3个变量,即整个文件名,主机和fp(代表file_path_differentiator)。
我正在使用read读取第一行并获取我的整个文件名变量,尽管我可以将其输入awk来获取接下来的两个变量,但是第一种插入变量的方法会产生错误,第二种给出我所有的变量。
我想循环每一行,因为我希望使用这些变量ssh到主机并抓取文件
#!/bin/bash
while read -r FILE
do
echo ${FILE}
host=`awk 'BEGIN { FS = "_" } ; { print $1 }'<<<<"$FILE"`
echo ${host}
path=`awk -v var="${FILE}" 'BEGIN { FS = "_" } ; { print $2 }'`
echo ${path}
done <zips_not_received.csv
预期结果
foop07_bar2_20190423152612.zip
foop07
bar2
foop07_bar1_20190423153115.zip
foop07
bar1
实际结果
foop07_bar2_20190423152612.zip
/ : No such file or directoryfoop07_bar2_20190423152612.zip
bar2 bar1 bar2 bar1
答案 0 :(得分:2)
您可以单独使用bash
进行此操作,而无需使用任何外部工具。
while read -r file; do
[[ $file =~ (.*)_(.*)_.*\.zip ]] || { echo "invalid file name"; exit 1; }
host="${BASH_REMATCH[1]}"
path="${BASH_REMATCH[2]}"
echo "$file"
echo "$host"
echo "$path"
done < zips_not_received.csv
答案 1 :(得分:1)
典型...
发布后设法使用解决方案...
#!/bin/bash
while read -r FILE
do
echo ${FILE}
host=`echo "$FILE" | awk -F"_" '{print $1}'`
echo $host
path=`echo "$FILE" | awk -F"_" '{print $2}'`
echo ${path}
done <zips_not_received.csv
不确定是否优雅或正确,因为我正在使用echo创建变量...但是我可以使用它。.
答案 2 :(得分:0)
假设您的“文件名”中没有空格或_作为主机或路径的一部分
如果使用默认的空格分隔符(或使用_作为批处理中的参数分隔符),请在sed,awk,...之前仅使用单行。看到您的示例,我将删除空行值作为基本安全性。
sed 's/_/ /g;/[[:blank:]]\{1,\}/d' zips_not_received.csv \
| while read host path Ignored
do
echo "${host}"
echo "${path}"
done