Вы также можете попробовать:
dpkg -l | egrep -i 'jre|java|jdk'
Если:
cat file
a
b
c
d
e
f match
g
h
i match
j
k
l
m
n
o
Затем:
awk '
{line[NR] = $0}
/match/ {matched[NR]}
END {
for (nr in matched)
for (n=nr-5; n<=nr+5; n+=5)
print line[n]
}
' file
a
f match
k
d
i match
n
Если:
cat file
a
b
c
d
e
f match
g
h
i match
j
k
l
m
n
o
Затем:
awk '
{line[NR] = $0}
/match/ {matched[NR]}
END {
for (nr in matched)
for (n=nr-5; n<=nr+5; n+=5)
print line[n]
}
' file
a
f match
k
d
i match
n
Если:
cat file
a
b
c
d
e
f match
g
h
i match
j
k
l
m
n
o
Затем:
awk '
{line[NR] = $0}
/match/ {matched[NR]}
END {
for (nr in matched)
for (n=nr-5; n<=nr+5; n+=5)
print line[n]
}
' file
a
f match
k
d
i match
n
Это невозможно сделать только с помощью grep. Если параметр ed имеет значение:
ed -s file << 'EOF'
g/match/-5p\
+5p\
+5p
EOF
В сценарии в основном говорится: для каждого совпадения / match /, напечатайте линию 5 строк до этого, затем 5 строк после этого, затем 5 строк после что.
Это, в основном, решение Гленна, но реализовано с помощью Bash, Grep и sed.
grep -n match file |
while IFS=: read nr _; do
sed -ns "$((nr-5))p; $((nr))p; $((nr+5))p" file
done
Обратите внимание, что номера строк меньше 1 будут делать ошибку sed, а номера строк больше числа строк в файле будет ничего не печататься.
Это всего лишь минимальный минимум. Чтобы заставить его работать рекурсивно и обрабатывать указанные выше номера строк, потребуется некоторое время.
awk '/match/{system("sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME)}' infile
Здесь мы используем функцию system(command) awk для вызова внешней команды sed для печати строк, которые awk соответствует шаблону match с 5 строками до и после матча.
Синтаксис прост, вам просто нужно поместить внешнюю команду в двойную кавычку, а также ее ключи и избежать того, что вы хотите точно передать команде, все остальное, связанное с параметрами awk, должно быть вне кавычки. Итак, ниже awk :
"sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME
перевести на:
sed -n "NR-5p; NRp; NR+5p" FILENAME
NR - номер строки, который соответствует шаблону match и FILENAME - текущее имя файла обработки, проходящее через awk.
с использованием текстового текстового файла @ glenn и использования perl вместо awk:
$ perl -n0E 'say /(.*\n)(?=(?:.*\n){4}(.*match.*\n)(?:.*\n){4}(.*\n))/g' ex
даст те же результаты, но работает быстрее:
a
f match
k
d
i match
n
с использованием текстового текстового файла @ glenn и использования perl вместо awk:
$ perl -n0E 'say /(.*\n)(?=(?:.*\n){4}(.*match.*\n)(?:.*\n){4}(.*\n))/g' ex
даст те же результаты, но работает быстрее:
a
f match
k
d
i match
n
Это невозможно сделать только с помощью grep. Если параметр ed имеет значение:
ed -s file << 'EOF'
g/match/-5p\
+5p\
+5p
EOF
В сценарии в основном говорится: для каждого совпадения / match /, напечатайте линию 5 строк до этого, затем 5 строк после этого, затем 5 строк после что.
Это, в основном, решение Гленна, но реализовано с помощью Bash, Grep и sed.
grep -n match file |
while IFS=: read nr _; do
sed -ns "$((nr-5))p; $((nr))p; $((nr+5))p" file
done
Обратите внимание, что номера строк меньше 1 будут делать ошибку sed, а номера строк больше числа строк в файле будет ничего не печататься.
Это всего лишь минимальный минимум. Чтобы заставить его работать рекурсивно и обрабатывать указанные выше номера строк, потребуется некоторое время.
awk '/match/{system("sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME)}' infile
Здесь мы используем функцию system(command) awk для вызова внешней команды sed для печати строк, которые awk соответствует шаблону match с 5 строками до и после матча.
Синтаксис прост, вам просто нужно поместить внешнюю команду в двойную кавычку, а также ее ключи и избежать того, что вы хотите точно передать команде, все остальное, связанное с параметрами awk, должно быть вне кавычки. Итак, ниже awk :
"sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME
перевести на:
sed -n "NR-5p; NRp; NR+5p" FILENAME
NR - номер строки, который соответствует шаблону match и FILENAME - текущее имя файла обработки, проходящее через awk.
с использованием текстового файла примера @ glenn и использования perl вместо awk:
$ perl -n0E 'say /(.*\n)(?=(?:.*\n){4}(.*match.*\n)(?:.*\n){4}(.*\n))/g' ex
даст те же результаты, но работает быстрее:
a
f match
k
d
i match
n
Это невозможно сделать только с помощью grep. Если параметр ed имеет значение:
ed -s file << 'EOF'
g/match/-5p\
+5p\
+5p
EOF
В сценарии в основном говорится: для каждого совпадения / match /, напечатайте линию 5 строк до этого, затем 5 строк после этого, затем 5 строк после что.
Это, в основном, решение Гленна, но реализовано с помощью Bash, Grep и sed.
grep -n match file |
while IFS=: read nr _; do
sed -ns "$((nr-5))p; $((nr))p; $((nr+5))p" file
done
Обратите внимание, что номера строк меньше 1 будут делать ошибку sed, а номера строк больше числа строк в файле будет ничего не печататься.
Это всего лишь минимальный минимум. Чтобы заставить его работать рекурсивно и обрабатывать указанные выше номера строк, потребуется некоторое время.
awk '/match/{system("sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME)}' infile
Здесь мы используем функцию system(command) awk для вызова внешней команды sed для печати строк, которые awk соответствует шаблону match с 5 строками до и после матча.
Синтаксис прост, вам просто нужно поместить внешнюю команду в двойную кавычку, а также ее ключи и избежать того, что вы хотите точно передать команде, все остальное, связанное с параметрами awk, должно быть вне кавычки. Итак, ниже awk :
"sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME
перевести на:
sed -n "NR-5p; NRp; NR+5p" FILENAME
NR - номер строки, который соответствует шаблону match и FILENAME - текущее имя файла обработки, проходящее через awk.