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
Общее правило псевдонимов: если он становится слишком сложным для псевдонима, используйте вместо него функцию.
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'
И вы не должны использовать [119845]-F' '[119846], [119847]awk[119848] использовать пробелы как отдельное поле по умолчанию.[119413].
Ответ Гнука абсолютно верен (поэтому я проголосовал за него), но я хотел бы предложить альтернативу:
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: разделитель по умолчанию уже является пустым пространством.Нет необходимости определять это.