Я не думаю, что -A
и -B
работают так, как вы ожидаете с -v
.Он не будет «также исключать» предыдущую или следующую строку.Поэтому я не верю, что существует решение вашей проблемы с использованием только grep
.
. Один из подходов состоит в том, чтобы получить номера строк строк, содержащих ваш шаблон, и строк, непосредственно предшествующих им.Затем используйте sed
, чтобы удалить эти номера строк:
grep -n -B 1 'The user' a.txt | egrep -v '^-' | sed -r 's/^([0-9]+).*/\1d/' | sed -f - a.txt
Результат:
$ grep -n -B 1 'The user' a.txt | egrep -v '^-' | sed -r 's/^([0-9]+).*/\1d/' | sed -f - a.txt
3095798 nsgg289 PEND intelg_sma gcn03 400./ Dec 19 09:51
One of the user's groups has reached its job slot limit;
3096822 nsgg289 PEND intelg_sma gcn03 460./ Dec 19 18:00
One of the user's groups has reached its job slot limit;
3098784 nsgg289 PEND intelg_sma gcn04 xhzha Dec 20 14:48
One of the user's groups has reached its job slot limit;
Объяснено:
grep -n -B 1 'The user' a.txt # Print each line matching 'The user' and one line preceding it, the -n flag prefixes output with line number
egrep -v '^-' # The use of grep -B causes grep to separate match groups with '--', we want to disregard those lines
sed -r 's/^([0-9]+).*/\1d/' # Extract the line numbers and with them create sed delete commands
sed -f - a.txt # and finally feed those commands to sed, operating on your input file