Почему моя команда не работает при искажении?

  • Когда предыдущая строка имеет D в конце,
    • и когда текущая строка имеет R в конце,
      • затем первое слово (-from) должен быть заменен -this.

awk сценарий:

# if the prev. line ended with D, and the current with R, replace first word
# optionally add && $1 == "-from"
has_d && /R$/ { $1 = "-this"; }
# print the current line, pretend that d is not matched yet
{ print; has_d = 0; }
# if line ends with D, set flag
/D$/ { has_d = 1; }

Один лайнер:

awk 'has_d&&/R$/{$1="-this"}{print;has_d=0}/D$/{has_d=1}' yourfile
2
13.05.2014, 01:48
3 ответа

Общее правило псевдонимов: если он становится слишком сложным для псевдонима, используйте вместо него функцию.

tomcat_id () {
  ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
}

Проблема с вашим определением псевдонима в том, что вы неправильно указали кавычки. Строка, определяющая псевдоним, является командой оболочки и анализируется оболочкой. Поскольку вы использовали двойные кавычки и, вероятно, в то время позиционных параметров не было (поэтому $ 2 заменяется пустой строкой), вы определили псевдоним

ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }'

. Простой способ определить псевдоним: использовать одинарные кавычки для определения и избегать использования одинарных кавычек в команде с псевдонимом. Пока я занимаюсь этим, я удалил -F "" , который в любом случае используется по умолчанию (и немного странно, потому что он выглядит как «пробел», но означает «любую последовательность пробелов»).

alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk "{print \$2}"'

Или вы можете использовать '\' ', чтобы эффективно заключить в кавычки одинарную кавычку внутри одинарного литерала.

alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk '\''{print \$2}'\'

Но, как я уже писал выше, используйте функцию, так нагляднее. Или, скорее, используйте соответствующий инструмент для работы:

alias tomcat_id='pgrep catalina'

или

alias tomcat_id='pidof catalina'
3
27.01.2020, 21:51
[119410] Вы должны избежать знака доллара в команде [119843]awk[119844]:

И вы не должны использовать [119845]-F' '[119846], [119847]awk[119848] использовать пробелы как отдельное поле по умолчанию.[119413].

2
27.01.2020, 21:51

Ответ Гнука абсолютно верен (поэтому я проголосовал за него), но я хотел бы предложить альтернативу:

alias tomcat_id="ps -ef|awk '\$8 ~ /java/ && /catalina/ {print \$2}'"

идея заключается в том, что в имени процесса (поле 8) мы должны найти java , а в строке в целом мы должны найти catalina .

Итак, мы позволяем awk выполнять всю работу по сопоставлению и печати. Не нужно беспокоиться grep ;)

Итак, значение:

$8 ~ /java/ && /catalina/ {print $2}

- это поле соответствия $ 8 регулярному выражению / java / и соответствует всей строке ( также можно явно использовать $ 0 ) против регулярного выражения / catalina / , и если это верно, вывести поле $ 2 . Помните, что уже было сказано в ответе Gnouc: разделитель по умолчанию уже является пустым пространством.Нет необходимости определять это.

3
27.01.2020, 21:51

Теги

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