Menggunakan ini:
grep -A1 -B1 "test_pattern" file
akan menghasilkan satu baris sebelum dan sesudah pola yang cocok dalam file. Apakah ada cara untuk menampilkan bukan garis tetapi sejumlah karakter tertentu?
Garis-garis di file saya cukup besar jadi saya tidak tertarik untuk mencetak seluruh baris tetapi hanya mengamati kecocokan dalam konteks. Ada saran tentang cara untuk melakukan hal ini?
Jawaban:
3 karakter sebelum dan 4 karakter setelah
$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' 23_string_and
sumber
brew install homebrew/dupes/grep
dan jalankan sebagaiggrep
.grep -E -o ".{0,5}test_pattern.{0,5}" test.txt
Ini akan mencocokkan hingga 5 karakter sebelum dan sesudah pola Anda. Tombol -o memberi tahu grep untuk hanya menampilkan pertandingan dan -E untuk menggunakan ekspresi reguler yang diperluas. Pastikan untuk meletakkan tanda kutip di sekitar ekspresi Anda, jika tidak, itu mungkin ditafsirkan oleh shell.
sumber
{0,255}
karya{0,256}
memberigrep: invalid repetition count(s)
Anda bisa menggunakan
awk '/test_pattern/ { match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20); }' file
sumber
Maksud Anda, seperti ini:
grep -o '.\{0,20\}test_pattern.\{0,20\}' file
?
Itu akan mencetak hingga dua puluh karakter di kedua sisi
test_pattern
. The\{0,20\}
notasi seperti*
, tapi menspesifikasikan nol sampai dua puluh pengulangan bukan nol atau more.The-o
mengatakan untuk hanya menampilkan pertandingan itu sendiri, bukan seluruh baris.sumber
grep: Invalid content of \{\}
Saya tidak akan pernah dengan mudah mengingat pengubah perintah samar ini jadi saya mengambil jawaban teratas dan mengubahnya menjadi fungsi di
~/.bashrc
file saya :cgrep() { # For files that are arrays 10's of thousands of characters print. # Use cpgrep to print 30 characters before and after search patttern. if [ $# -eq 2 ] ; then # Format was 'cgrep "search string" /path/to/filename' grep -o -P ".{0,30}$1.{0,30}" "$2" else # Format was 'cat /path/to/filename | cgrep "search string" grep -o -P ".{0,30}$1.{0,30}" fi } # cgrep()
Inilah yang terlihat seperti beraksi:
$ ll /tmp/rick/scp.Mf7UdS/Mf7UdS.Source -rw-r--r-- 1 rick rick 25780 Jul 3 19:05 /tmp/rick/scp.Mf7UdS/Mf7UdS.Source $ cat /tmp/rick/scp.Mf7UdS/Mf7UdS.Source | cgrep "Link to iconic" 1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri $ cgrep "Link to iconic" /tmp/rick/scp.Mf7UdS/Mf7UdS.Source 1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri
File yang dimaksud adalah satu baris 25K terus menerus dan tidak ada harapan untuk menemukan apa yang Anda cari menggunakan reguler
grep
.Perhatikan dua cara berbeda untuk memanggil metode
cgrep
paralel itugrep
.Ada cara yang "lebih baik" untuk membuat fungsi di mana "$ 2" hanya diteruskan saat disetel yang akan menghemat 4 baris kode. Saya tidak memiliki itu berguna. Sesuatu seperti
${parm2} $parm2
. Jika saya menemukannya, saya akan merevisi fungsi dan jawaban ini.sumber
Dengan
gawk
, Anda dapat menggunakan fungsi pencocokan:x="hey there how are you" echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}' ere are
Jika Anda setuju dengan
perl
, solusi yang lebih fleksibel: Berikut ini akan mencetak tiga karakter sebelum pola diikuti dengan pola sebenarnya dan kemudian 5 karakter setelah pola.echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/' ey there how
Ini juga dapat diterapkan ke kata, bukan hanya karakter. Mengikuti akan mencetak satu kata sebelum string yang cocok.
echo hey there how are you |perl -lne 'print $1 if /(\w+) there/' hey
Berikut ini akan mencetak satu kata setelah pola:
echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/' how
Mengikuti akan mencetak satu kata sebelum pola, lalu kata sebenarnya dan kemudian satu kata setelah pola:
echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)( there )(\w+)/' hey there how
sumber
Anda dapat menggunakan grep regexp untuk menemukan + grep kedua untuk sorotan
echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' | grep string
23_string_and
sumber