используйте переменную awk в скрипте bash

#bash #awk

Вопрос:

У меня есть файл txt в формате blow:

 66.57.21 - john
88.43.23 - albert
10.10.11 - smith
 

Я хочу казнить «connect.py 66.57.21 джон» для каждой строки, и я написал этот сценарий bash:

 #!/bin/bash
while read LINE; do
awk -v number = "$LINE" '$1'
awk -v name = "$LINE" '$3'
  connect.py $name $number
done < "$1"
 

но сценарий bash не сработал

В чем проблема

Комментарии:

1. Почему нет while read -r ip stuff user; do connect.py "$ip" john; done < file.txt ? Прочитав 3 переменные, read вы разделите информацию для вас.

2. См . BashFAQ #1: Как я могу прочитать файл (поток данных, переменную) построчно (и/или поле за полем)? И это использование awk совершенно неправильно.

3. Пожалуйста. Удачи вам в написании сценариев.

Ответ №1:

 #!/usr/bin/env bash
while read -r number _ name; do
  connect.py "$name" "$number"
done < "$1"
 

Комментарии:

1. Эй! connect.py "$name" "$number" < /dev/tty может быть, так будет безопаснее на случай connect.py прочитал бы из stdin.

Ответ №2:

Если вы хотите использовать awk, вот один из способов сделать это:

 awk -F" " '{system("connect.py " $3 " " $1)}' input.txt
 

-F" " Разбивает каждую строку ввода на пробелы

$1 является первым словом в массиве (число в исходном вопросе)

$3 является ли он третьим словом в массиве (имя в исходном вопросе)

обертывание "connect.py " $3 " " $1 system() приводит к тому, что оболочка выполняет команду после выполнения замен

т.е.: connect.py john 66.57.21

Комментарии:

1. Одна вещь, которой вы хотите избежать при написании сценариев, — это создание вложенных ячеек в цикле. Это делает сценарии оболочки S L O W…. Здесь вы создаете 9 подоболочек на каждой итерации. Подстановка команд порождает подоболочку. Каждая труба имеет подоболочку, и у вас есть команды по обе стороны трубы. Ой! Если вы читаете 1000 или около того строк, нет проблем, если это 1 000 000 — идите обедать и возвращайтесь намного позже. Всегда старайтесь ограничить или исключить поведение такого типа. Здесь, если вы хотите использовать awk , вы можете сделать все это за один вызов awk и использовать system() для подключения. Совет — никаких вмятин.

2. Кроме того, вы совершаете UUOc ( Ненужное использование cat , также заявленное как Бесполезное использование cat ). Всякий раз, когда вы cat file ... объединяете и не объединяете файлы, это UUOc . Обычно рассматривается как cat file | someUtility . См. Бесполезное использование Cat . Вместо этого все утилиты будут либо принимать имена файлов в качестве аргумента, либо принимать входные данные stdin . Так что это правильно someUtility file или someUtility < file … .. :)

3. У вас также есть переменные без кавычек, которые используются read таким образом, что это приведет к повреждению строк, содержащих экранирование, неправильному использованию всех имен переменных в верхнем регистре и т. Д. Скопируйте/вставьте свой скрипт в shellcheck.net и это расскажет вам о некоторых проблемах.

4. Спасибо вам обоим. Я обновил информацию на основе ваших коллективных отзывов. Дай мне знать, что ты думаешь.