从文件中读取时如何在awk中使用变量

时间:2019-04-29 12:23:54

标签: bash variables awk

我有一个包含以下条目的文件:

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

3 个答案:

答案 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