Как построить длинную командную строку?

У меня есть последовательность команд, которые будут использоваться вместе с множеством трубопроводов, примерно так:

awk '{ if ($8 ~ "isad") {print $2, $5, "SE"} else {print $2, $5, "ANT"} }' "/var/log/apache2/other_vhosts_access.log" | grep -v '127.0.0.1' | tr '[' '\0' | tr [:lower:] [:upper:] | sort -t' ' -s -k3 

Это в основном фильтрует журнал Apache и печатает три столбца информации. Первый col – это IP-адрес, второй – время, третий – строка. Вывод может быть отсортирован на основе любого столбца, поэтому мне нужно использовать '-m' с сортировкой для поля времени. Порядок сортировки также может быть отменен.

Я хочу, чтобы строка хранила аргументы для сортировки, и пусть комбинированные строки выполняются. Что-то вроде этого:

 $AWK_CMD | $SORT_CMD $SORT_KEY $SORT_REV 

где

 SORT_CMD="sort -t' '" SORT_KEY="-k$1" # $1 from cmd line arg SORT_REV="$2" # Either -r or blank 

Я могу построить такие строки; когда я повторяю это, все выглядит хорошо. Проблема в том, как ее выполнить? Я получаю некоторые ошибки, например:

 awk '{ if ($8 ~ "isad") {print $2, $5, "SE"} else {print $2, $5, "ANT"} }' "/var/log/apache2/other_vhosts_access.log" | grep -v '127.0.0.1' | tr '[' '\0' | tr [:lower:] [:upper:] | sort -t' ' -s -k3 Running ... awk: '{ awk: ^ invalid char ''' in expression 

Пожалуйста, проигнорируйте, если сортировка не сортируется правильно, это может быть исправлено. Я хочу знать, как я могу построить финальную командную строку в шагах. Способы, которые я пытался выполнить эту команду в скрипте,:

 $final_cmd `$final_cmd` 

Изменить: сценарий, который я пытаюсь использовать

 KEY=$1 # Values {1, 2, 3} REVERSE=$2 # Values {0, 1} SORT_CMD="sort -t' ' -s" SORT_KEY="-k$KEY" if [[ $KEY -eq 2 ]] then SORT_KEY="-m -k2" fi if [[ $REVERSE -eq 1 ]] then SORT_REV="-r" else SORT_REV= fi final_cmd="awk '{ if (\$8 ~ \"isad\") {print \$2, \$5, \"SE\"} else {print \$2, \$5, \"ANT\"} }' $LOG_FILE '|' grep -v '127.0.0.1' '|' tr '[' '\0' '|' tr [:lower:] [:upper:] '|' $SORT_CMD $SORT_KEY $SORT_REV" echo $final_cmd echo "Running ..." $final_cmd 

2 Solutions collect form web for “Как построить длинную командную строку?”

Различные части могут быть помещены в функции оболочки:

 awkfilter() { awk '{ if ($8 ~ "isad") {print $2, $5, "SE"} else {print $2, $5, "ANT"} }' $1 } toupper() { tr [:lower:] [:upper:] } dosort() { sort -t' ' -s -k3 } awkfilter "/var/log/apache2/other_vhosts_access.log" | grep -v '127.0.0.1' | tr '[' '\0' | toupper | dosort 

то вы можете сделать вещи опционально более легко:

 dosort() { rev="" if [ "$2" == "reverse" ] then rev='-r' fi sort -t' ' -s -k$1 $rev } 

Когда ваша командная строка начинает очень долго, писать ее в скрипте и разбивать ее по частям (с функциями) обычно очень полезно.

Когда вы запускаете awk '{ ... }' в командной строке оболочки или из сценария оболочки, оболочка анализирует кавычки и передает аргумент awk без кавычек. Случается, что вы каким-то образом запускаете его с кавычками в параметре.

Измените: с вашим обновлением на вопрос, что вам нужно – sh -c "$final_cmd" .

  • Как я могу перечислить содержимое архивного архива без его запуска?
  • Как удалить конечный CRLF из файла?
  • Использовать файл в каталоге как аргумент, но без расширения
  • Генерация случайных чисел в Solaris?
  • Использование df и попытка awk определенного столбца
  • Выполнение команд с помощью сценария ssh и оболочки с использованием переменных на удаленной машине
  • Как постоянно выполнять резервное копирование файлов журнала?
  • У меня есть многострочная строка, которую мне нужно перебрать, но я не использую bash. Совет?
  • ./executable: невозможно выполнить двоичный файл
  • Назначение команды массиву в сценарии оболочки не работает?
  • Как именно `if $ cmd; затем $ cmd; fi` отличаются от `$ cmd && $ cmd`?
  • chown не работает через скрипт
  • Linux и Unix - лучшая ОС в мире.