Как использовать переменную с awk при чтении из файла - PullRequest
1 голос
/ 29 апреля 2019

У меня есть файл со следующими записями:

foop07_bar2_20190423152612.zip
foop07_bar1_20190423153115.zip
foop08_bar2_20190423152612.zip
foop08_bar1_20190423153115.zip

, где

foop0* = host
bar* = fp

Я хотел бы прочитать файл и создать 3 переменные, полное имя файла, host и 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 ]

2 голосов
/ 29 апреля 2019

Вы можете сделать это в одиночку с 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 голос
/ 29 апреля 2019
*

типичный ... * 1001

Успел отработать решение после публикации ...

#!/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 для создания переменной ... но у меня она работает ..

0 голосов
/ 29 апреля 2019

Предполагая, что в вашем "имени файла" нет пробела или _, которые являются частью хоста или пути

просто отделяйте строку с помощью sed, awk, ..., если используете разделитель пробелов по умолчанию (или используйте _ в качестве разделителя аргументов в пакете). Я добавляю значение удаления пустой строки в качестве базовой безопасности, увидев ваш образец.

sed 's/_/ /g;/[[:blank:]]\{1,\}/d' zips_not_received.csv \
 | while read host path Ignored
    do
      echo "${host}"
      echo "${path}"
    done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...