Saya ingin menjalankan ack atau grep pada file HTML yang sering memiliki baris yang sangat panjang. Saya tidak ingin melihat garis yang sangat panjang yang membungkus berulang kali. Tapi saya ingin melihat hanya bagian dari garis panjang yang mengelilingi string yang cocok dengan ekspresi reguler. Bagaimana saya bisa mendapatkannya dengan menggunakan kombinasi alat Unix?
90
ack
? Apakah itu perintah yang Anda gunakan saat Anda tidak menyukai sesuatu? Sesuatu sepertiack file_with_long_lines | grep pattern
? :-)ack
(dikenal sebagaiack-grep
Debian)grep
menggunakan steroid. Ini juga memiliki--thpppt
opsi (tidak bercanda). betterthangrep.com--thpppt
fitur agak kontroversial, keuntungan kunci tampaknya bahwa Anda dapat menggunakan Perl regexes langsung, tidak beberapa gila[[:space:]]
dan karakter seperti{
,[
, dll berubah berarti dengan-e
dan-E
switch dengan cara yang tidak mungkin untuk mengingat.Jawaban:
Anda dapat menggunakan opsi grep
-o
, mungkin dikombinasikan dengan mengubah pola Anda".{0,10}<original pattern>.{0,10}"
untuk melihat beberapa konteks di sekitarnya:..atau
-c
:sumber
$ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt
cetakanqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
oE ".{0,20}mysearchstring.{0,20}"
Anda kehilangan sorotan dari string "asli" bagian dalam yang berlawanan dengan konteks, karena semuanya menjadi pola pencarian. Ingin sekali menemukan cara untuk menyimpan beberapa konteks yang tidak disorot di sekitar hasil penelusuran, untuk pemindaian visual dan interpretasi hasil yang lebih mudah.-oE ".{0,x}foo.{0,x}"
pendekatan (di manax
jumlah karakter konteks) - tambahkan `| grep foo `sampai akhir. Berfungsi untuk solusi ack atau grep. Lebih banyak solusi juga di sini: unix.stackexchange.com/questions/163726/…Masukkan hasil Anda melalui
cut
. Saya juga mempertimbangkan untuk menambahkan--cut
sakelar sehingga Anda dapat mengatakan--cut=80
dan hanya mendapatkan 80 kolom.sumber
| cut=c1-120
grep, bekerja untuk saya (meskipun tidak tahu cara memotong teks yang cocok)| cut=c1-120
tidak berhasil untuk saya, saya perlu melakukannya| cut -c1-120
| cut -c 1-100
stackoverflow.com/a/48954102/1815624--no-wrap
opsi yang digunakan$COLUMNS
?Anda dapat menggunakan lebih sedikit sebagai pager untuk ack dan memotong garis panjang:
ack --pager="less -S"
Ini mempertahankan garis panjang tetapi membiarkannya dalam satu baris, bukan membungkusnya. Untuk melihat lebih banyak garis, gulir ke kiri / kanan lebih sedikit dengan tombol panah.Saya memiliki pengaturan alias berikut untuk ack untuk melakukan ini:
sumber
--pager
perintah itu di file ~ / .ackrc Anda, jika Anda selalu ingin menggunakannya.ack
.ack
cukup miripgrep
, hanya lebih sederhana dalam kasus yang paling umummendapat karakter dari 1 hingga 100.
sumber
Diambil dari: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/
Pendekatan yang disarankan
".{0,10}<original pattern>.{0,10}"
sangat bagus kecuali untuk warna highlight yang sering kacau. Saya telah membuat skrip dengan keluaran yang serupa tetapi warnanya juga dipertahankan:#!/bin/bash # Usage: # grepl PATTERN [FILE] # how many characters around the searching keyword should be shown? context_length=10 # What is the length of the control character for the color before and after the # matching string? # This is mostly determined by the environmental variable GREP_COLORS. control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1)) control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1)) grep -E --color=always "$1" $2 | grep --color=none -oE \ ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"
Dengan asumsi skrip disimpan sebagai
grepl
, makagrepl pattern file_with_long_lines
harus menampilkan baris yang cocok tetapi dengan hanya 10 karakter di sekitar string yang cocok.sumber
Inilah yang saya lakukan:
Dalam .bash_profile saya, saya mengganti grep sehingga secara otomatis berjalan
tput rmam
sebelum dantput smam
sesudah, yang menonaktifkan pembungkusan dan kemudian mengaktifkannya kembali.sumber
Dalam situasi yang tidak biasa di mana Anda tidak dapat menggunakan
-E
, Anda dapat menggunakan:sumber
Saya memasukkan yang berikut ke dalam saya
.bashrc
:Anda kemudian dapat menggunakan
grepl
di baris perintah dengan argumen apa pun yang tersedia untukgrep
. Gunakan tombol panah untuk melihat ekor garis yang lebih panjang. Menggunakanq
untuk berhenti.Penjelasan:
grepl() {
: Tentukan fungsi baru yang akan tersedia di setiap konsol bash (baru).$(which grep)
: Dapatkan jalur lengkapgrep
. (Ubuntu mendefinisikan alias untukgrep
itu yang setara dengangrep --color=auto
. Kami tidak menginginkan alias itu tetapi yang asligrep
.)--color=always
: Mewarnai keluaran. (--color=auto
dari alias tidak akan berfungsi karenagrep
mendeteksi bahwa output dimasukkan ke dalam pipa dan tidak akan mewarnainya.)$@
: Letakkan semua argumen yang diberikan kegrepl
fungsi di sini.less
: Menampilkan garis menggunakanless
-R
: Tampilkan warnaS
: Jangan putus antrean panjangsumber