Grep komutunu daha az gösteren grep komutunu dosya adı olarak gösterme


1

less -M dosya adını aşağıdaki gibi bir bilgi istemi olarak gösterir:

      1 asdf
test.txt lines 1-1/1 (END)

Grep'i daha kolay okumak için daha az boruya geçirmeyi seviyorum. Grep komutunu komut istemi için dosya adı olarak yorumlamayı daha az alabilir miyim?

Normalde sadece:

grep asdf test.txt | less :

      1 asdf
lines 1-1/1 (END)

İsterim ki:

grep asdf test.txt | less :

      1 asdf
grep asdf test.txt lines 1-1/1 (END)

Bunların hepsini bir betiğe sarabileceğimi ve $0argümanlarla bir şeyler yapacağımı ancak tekerleği burada yeniden icat etmeye çalışamayacağımı biliyorum .

Bu sadece birkaç komut satırı hilesiyle mümkün mü?


grep -H? Dosya
adını

less -MKullanılan grep komutu tarafından yorumlandığı şekliyle "dosya adını" istedim ; Benim örneğimde bu komut grep asdf text.txtdosya adını daha az gösteren bir şeydi, ilk başta aradığımı basit bir şekilde hatırlattı.
Mike Dannyboy,

Yanıtlar:


1

lessBirisi, lesso süreç grubunda lessçalışan süreç grubunu ve diğer süreçler grubunu bulmak için kodun çok fazla karmaşık olması dışında, standart girdi yoluyla kendisine veri besleyen borunun diğer tarafında ne olduğuna dair bir ipucuna sahip değildir. Bunların hepsinin nasıl bir araya geldiğini bilen (kabuk bu bilgiyi bilir ancak bu bilgiyi kullanamayabilir).

less(1)Birinde bazı okumalardan -Pistemi özelleştirmek için seçenek bulabilirsiniz

$ echo hi | less -P '?f%f:Standard input'
hi
Standard input

öyleyse teoride, Standard inputbit'i mevcut kabuk boru hattıyla değiştirebilirsek ... bakalım ne setzaman lessçalıştırıldığına ...

$ function less { set > whatisset; command less "$@"; }
$ echo foo | less
foo
$ egrep 'echo|foo' whatisset
$ 

bu nedenle mksh, ( echoya da fooeşdeğerinize grep) için kullanılacağı açık olan hiçbir şey , kabuk ortamında hiçbir yerde görünmez ( zshvay için aynı hikaye ve ah bash, Linux'taki ortamla ayarları aynı ama yine aynı hikaye ile spam). Aslında, komut satırını kullanılabilir duruma getirmek için zshbir preexecişlev kullanabiliriz:

$ zsh
% function preexec { shift; SHORT=$1; }
% function less { set > whatisset; command less "$@"; }
% echo foo | less
foo
% grep SHORT whatisset
SHORT='echo foo | less'
% 

biri bir şey yapabilir

% less() { =less -P '?f%f:'${SHORT%% | less} "$@"; }
% echo hi|less
hi
echo hi

Harika teşekkürler. Bu yüzden, uzun ve kısa olanı, zsh ile yapılabildiği ancak bash'te kolay olmadığı anlaşılıyor. Düşündüğüm gibi, hiçbir şey basitçe. Ayrıntılı cevap için teşekkürler, yeni şeyler öğrenmek her zaman harika.
Mike Dannyboy

0

Kendime karşı çıktım ve bunu yapan küçük bir senaryo yazdım. Güzel değil ama işe yarıyor ve sadece birkaç satır olduğu için fena değil. Gelişmeler için her zaman hazır.

#!/bin/bash

# store all args as string
allargs="$*"

# create temp file named as grep command
TMPFILE=$(mktemp -q "$allargs")

# run grep command
$* --color=always > "$TMPFILE" # --color=always with less -r will highlight results in less

# show results file in less
less -Mr "$TMPFILE"

# delete the temp file
rm -f -- "$TMPFILE"

Olarak çalıştır ./scriptname grep <opts> <regex> <file(s)>.

Dezavantajı: eğer fileolduğunu *o zaman onlar da ekran (çok uzun dosya adı) komutu iter olarak amacı yendi dosya adının bir parçası olarak genişletilmiş ve yapılır (simdiki tüm arama). Dosya adını yatay olarak kaydırmanın bir yolu yoksa less?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.