Как написать скрипт, принимающий ввод со стандартного ввода или из файла?

Если эта команда не имеет опции молчания, перенаправить ошибку в /dev/null.

oidvalue=$(snmpget -v 2c -c public localhost 1234 2>/dev/null)
0
18.04.2020, 21:07
3 ответа

1 Ввод из файла

Вы можете написать небольшой скрипт для чтения имен файлов, чтобы работать с файлом.

Пример файла

$ cat /tmp/files.txt
one.txt
two.txt
three.txt

Скрипт

while read -r fileName; do 
    gawk -f awk_prac.awk $fileName; 
done < /tmp/files.txt

Выход:

one.txt
two.txt
three.txt

2 Ввод со стандартного ввода

В аналогичных строках вы также можете получать ввод со стандартного ввода. Вы можете указать одно имя файла в строке или все имена файлов в одной строке и соответственно написать сценарий.

0
19.03.2021, 02:27

Файл сценария driver.sh

#!/usr/bin/bash

for argument do
gawk -f awk_prac.awk "$argument";
done

Исполнение(можно дать несколько файлов):

$./driver.sh file1.txt file2.txt... [filen.txt]

Если имена файлов должны быть заданы в стандартном вводе , можно использовать цикл for для каждого запускаемого файла:

while read -p "Enter File name : " file
do
gawk -f awk_prac.awk $file
echo "Press Ctrl+C to quit"
done

Казнь :Просто

$./driver.sh
0
19.03.2021, 02:27

Два решения, в зависимости от того, что вы собираетесь cat text.txt | driver.shдолжно делать (, которое, кстати, лучше записывается какdriver.sh <text.txt).

  1. Считать данные из text.txt.
  2. Считать пути из text.txt.

Ваш "драйвер" (оболочка, действительно )скрипт может добавить /dev/stdinв список позиционных параметров, если этот список пуст:

#!/bin/sh

if [ "$#" -eq 0 ]; then
    set -- /dev/stdin
fi

gawk -f awk_prac.awk "$@"

Это заставит сценарий awkполучать ввод из стандартного потока ввода, если сценарий-оболочка вызывается без каких-либо аргументов.

Обратите внимание на цитирование "$@". Это будет расширяться до каждого позиционного параметра (аргумента сценария оболочки ), заключенного в кавычки по отдельности, что означает, что он будет работать с именами файлов, в именах которых есть пробелы и / или символы оболочки.

Если ваш awkкод ожидает одиночный файл для каждого вызова, используйте цикл:

#!/bin/sh

if [ "$#" -eq 0 ]; then
    set -- /dev/stdin
fi

for pathname do
    gawk -f awk_prac.awk "$pathname"
done

Если вы под чтением стандартного ввода подразумеваете, что хотите читать имена путей из стандартного ввода (, а не данные для обработки ),тогда вы можете использовать xargs(, так как количество путей может превышать максимальную длину командной строки, сгенерированной для вызова вас awkscript):

#!/bin/sh

if [ "$#" -eq 0 ]; then
    cat
else
    printf '%s\n' "$@"
fi | xargs -r gawk -f awk_prac.awk

Это передает имена путей из стандартного ввода напрямую (черезcatxargs, если сценарию не переданы аргументы. Если есть аргументы, они печатаются в виде списка с разделителями -новой строки для обработки xargs. Опять же, цитирование "$@"необходимо.

Параметр -rдля xargsостанавливает выполнение утилиты gawk, если для нее не предоставлены данные составным оператором if. Это нестандартная опция -, см. руководство по xargs.

Если ваш awkкод ожидает одного файла для каждого вызова, используйте xargsс -L 1.

0
19.03.2021, 02:27

Теги

Похожие вопросы