обработка awk с переменной - PullRequest
1 голос
/ 19 июня 2020

входной файл:

line1 [time-1] abcdef
line2 [time-1] absde1
line3 [time-1] abcdef
line4 [time-1] zzzzzz

эта команда работает нормально:

$ str="abcdef|zzzzzz"
$ awk '!($0~/('"$str"')$/)' test_input
line2 [time-1] absde1

следующая команда не работает:

$ str="[time-1] abcdef|[time-1] zzzzzz"
$ echo "${str}"
[time-1] abcdef|[time-1] zzzzzz
$ awk '!($0~/('"$str"')$/)' test_input
awk: fatal: Invalid range end: /([time-1] abcdef|[time-1] zzzzzz)$/
$

Можно ли передать переменную с такой строкой к awk тоже?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Еще один awk:

awk -v str="$str" 'BEGIN {
   n = split(str, a, "|")
}
{
   for (i=1; i<=n; i++)
      if (index($0, a[i]))
         next
   print
}' file

line2 [time-1] absde1

Причина, по которой вы не можете просто использовать $str в качестве регулярного выражения, заключается в том, что у вас есть метасимволы регулярного выражения, такие как [, ] эт c.

0 голосов
/ 19 июня 2020

Вам просто нужно выйти из квадратных скобок

$ str="\[time-1\] abcdef|\[time-1\] zzzzzz"
$ awk '!($0~/('"$str"')$/)' test_input
line2 [time-1] absde1

--- Изменить --------------------------

Чтобы создать переменную str с экранированными символами

str="[time-1] abcdef|[time-1] zzzzzz" | sed -e 's/[]\/$*.^[]/\\&/g'

Таким образом, список, разделенный вертикальной чертой, может быть автоматически сгенерированным списком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...