【问题标题】:How to use variable with awk when being read from a file从文件中读取时如何在 awk 中使用变量
【发布时间】:2019-09-18 01:49:56
【问题描述】:

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

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

【问题讨论】:

    标签: bash variables awk


    【解决方案1】:

    您可以单独使用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
    

    【讨论】:

      【解决方案2】:

      典型...

      发布后设法解决...

      #!/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 创建变量...但我可以正常工作..

      【讨论】:

      • 你也可以while IFS=_ read -r host path rest; do echo "${host}_${path}_${rest}"; echo "$host"; echo "$path"; done &lt;file
      【解决方案3】:

      假设您的“文件名”中没有空格或 _ 作为主机或路径的一部分

      如果使用默认的空格分隔符(或在批处理中使用 _ 作为参数分隔符),只需在 sed、awk、... 之前分隔行。看到您的示例,我将删除空行值添加为基本安全性。

      sed 's/_/ /g;/[[:blank:]]\{1,\}/d' zips_not_received.csv \
       | while read host path Ignored
          do
            echo "${host}"
            echo "${path}"
          done
      

      【讨论】:

      • 如前所述,while IFS=_ read host path Ignored 也可能适合您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2014-10-15
      • 2019-01-17
      • 2012-04-16
      • 2021-05-22
      • 2013-02-28
      • 1970-01-01
      相关资源
      最近更新 更多