#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. Спасибо вам обоим. Я обновил информацию на основе ваших коллективных отзывов. Дай мне знать, что ты думаешь.