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

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

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" .

  • Bash здесь - документы и линии shebang
  • Простой сценарий bash для резервного копирования и удаления каталогов
  • Получить PID хост-скрипта в bash
  • Как убедиться, что встроенное эхо-сообщение оболочки вызвано так, что оно не отображается в списке процессов?
  • Как создать сценарий переключения вывода xrandr?
  • Как использовать команду tee с эхом в соответствии с требованиями ниже?
  • Расширение Bash $ {@} как команда
  • Как превратить весь stdin в аргумент командной строки дословно?
  • Как я могу запустить этот скрипт python во всех html-файлах под каталогом?
  • Замените «...» многострочный вывод команды find
  • Shell Script для удаления двойных кавычек в пределах значения столбца
  • Interesting Posts

    создать raid1 из существующего локального объема lvm

    Установка Wireshark или MC хочет удалить gnome и многое другое

    Does -o и -i имеют смысл, когда целевой хост уже подключен к указанному интерфейсу?

    Какой тип данных содержит входной файл?

    Недопустимое MIT-Magic-Cookie на собственной машине с каждым новым Wi-Fi-соединением

    Скопируйте файлы с удаленного сервера на локальный, игнорируя существующие файлы (rsync недоступен)

    Каковы числа после версии в выводе политики apt-cache?

    Оптимальная конфигурация SSD

    Что означает «func 08 lookup от nouveau», «-2» означает?

    Предпочтение IP-псевдонимов

    Удалите новую строку \ linefeed перед повторением регулярного выражения

    Как утверждать, что строка имеет символ новой строки и, если это так, удалите ее

    Как вырезать последние 5 укусов в одном конкретном столбце для всех строк

    Могу ли я определить, было ли построено собственное ядро ​​с поддержкой модулей?

    Блоки туннелей IPsec через некоторое время без ошибок. Где найти детали?

    Linux и Unix - лучшая ОС в мире.