Neden boru komutu “l | grep ”1“ ”yanlış sonuç alıyor mu?


13

Resimde gösterildiği gibi, ldosyayı geçerli klasöre almak için kullanıyorum . Ve sonra dosyayı numara ile almak istiyorum 1, bu yüzden pipeve grep.

Ama 2ve 22dosya neden ortaya çıkıyor? Peki nedir 1;34m?

$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22

Güncelleme

Ben komuta takma zaten lbenim de zshrcdosyaya.

 alias lsp="ls"
 alias ll='ls -alF'
 alias la='ls -A'
 alias l='ls -CF'
 alias ls="ls -alh --color"

Ve işte typekomutun sonucu :

>$ type ls
ls is an alias for ls -alh --color

> $ type l
l is an alias for ls -CF

4
Lütfen metnin ekran görüntülerini göndermeyin. Metni buraya kopyalayın ve kod biçimlendirmesi uygulayın.
muru

@muru Bence çıktı çıktı sormak istedim type -a l?
WinEunuuchs2Unix

@ WinEunuuchs2Unix ah, evet.
muru

@ type lsLütfen komutun çıktısını göndermenizi isteyebilir miyim ? lstakma adı herhangi bir şekilde değiştirdiniz mi?
Sergiy Kolodyazhnyy

@Serg zaten güncellendi.
Lee

Yanıtlar:


27

Her şeyden önce, yapmaya çalıştığınız l| grep <filename>şey kötü. Yapma. İşte nedeni.

l komut gerçekten bir takma addır ls -CF

$ type -a l
l is aliased to `ls -CF'

Ubuntu en Varsayılan olarak bash, lsbir diğer adıdır ls --color=auto. Steeldriver'ın belirttiği gibi --color=auto, renklendirmeyi kapatması gerekiyor. Belirli bir durumda, sahip alias ls="ls -alh --color"ve alias l="ls -CF"temelde varlık biter, hangi ls -alh --color -CF. Bu anahtar kombinasyonu hala bir boru üzerinden renklendirilmiş çıktı gönderir. Örneğin:

$ ls -alh --color -CF ~/TESTDIR | cat -A                                                                                 
^[[0m^[[01;34m.^[[0m/  ^[[01;34m..^[[0m/  1.txt  2.txt  3.txt  out.txt$

.Ve ..dizinlerinin nasıl aynı kaçış dizisine sahip olduğuna dikkat edin .

Bütün bunlar ne anlama geliyor?

Bu l, dosya türüne göre renklendirilmiş dosya listesi çıkacağı anlamına gelir . Sorun şu ki renklendirme kaçış dizilerinin kullanımıyla gerçekleşiyor . En neyi Yani 1:34mşeylerdir - bunlar belirli renkler için konum çıkış sırası.

Ana sorun, ayrıştırma işleminin lsgenellikle yanlış çıktıya ve komut dosyalarında felaketlere yol açmasıdır, çünkü lsdaha önce açıklandığı gibi kaçış dizilerine ve diğer özel karakterlere izin verir. Daha fazla bilgi için bu makaleye bakın: http://mywiki.wooledge.org/ParsingLs

Ne yapmalısınız?

findKomutu kullan :

bash-4.3$ ls
1.txt  2.txt  3.txt  out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt

Kabuk glob ve modern test [[komutu ile böyle bir şey yapabilirsiniz :

bash-4.3$ for file in * ;do if [[ "$file" =~ "1"  ]] ;then echo "$file" ;fi ; done
1.txt

Ya da bashtek başına olduğundan çok daha iyi dosya adı işleme yeteneklerine sahip python kullanın

bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']

Çıktının işlenmesine gerek yoksa ls, basit globbing lsde işi yapabilir. (Unutmayın, bu yalnızca dosya listesini görüntülemek içindir, çıktı metni ile ilgilenmek için başka bir programa aktarmak için değildir)

bash-4.3$ ls *1*
1.txt

2
Ben çıkışı sadece colorized düşünüyorum bir boruda eğer --color=alwaysbiri için takma parçası olarak - aynı zamanda belirtilen lveya bir önceki takma içinde ls(varsayılan yerine kendisi alias ls='ls --color=auto').
kaynakçı

@steeldriver İyi bir nokta, ama lsvarsayılan olarak bash'da olan bu değil mi? type lsbana bunun için bir takma ad verirls --color=auto
Sergiy Kolodyazhnyy

1
Evet, bu varsayılan autodeğerdir - ancak bir AFAIK borusunda rengi kapatır. ANSI renk dizilerini görmek için --color=always, ya takma lsl
adda

Ne demek istediğini anlıyorum. Bu çok garip.
Sergiy Kolodyazhnyy

@steeldriver Bu yüzden OP'den takma adlarını göndermesini istedim ve görünüşe göre sahip oldukları şey ls --colorrenklenmeyi önlemiyor (bunu kendim de test ettim). Cevabımı buna göre güncelledi
Sergiy Kolodyazhnyy

6

Sizin lve lskomutlarınız takma ad olarak ayarlanmıştır.

Bunları çıkardığınızda çıktıyı görüntülenen her ekran çizgisinden grep "1"(kullanarak |) kırmızı renkli 1olarak görüntülenir 1.

Dosya adları Çünkü ., .., 2ve 22aynı ekran satırında görünür, bunlar tarafından çıkış vardır grepsıra ancak kırmızı hangi gösterileri görünmüyor grepmaçları.

:34mDüzgün boya olmayan bir renk için bir kaçış dizisidir. Gözden geçirilmiş sorunuzun çıktısına dayanarak type -a lve type -asistemimde çoğaltılabilir. Eğer adresinin takma değiştirmelisiniz unutmayın --coloriçin --color=auto:

Renk çıktısı

renk ls


1:34mŞeyler metnin renklendirme için kullanılan onlar ediyoruz kaçış dizileri, yolsuzluk değildir. Bu kısımdaki cevabımı görün;)
Sergiy Kolodyazhnyy

@Serg Teşekkürler. Takma adlarla OP revize sorusuna dayanarak revize ettim.
WinEunuuchs2Unix

1

Denemenizde, lstakma adınızı , dolayısıyla 1;34mrenklendirmeden gelen ve benzer gürültüyü çağırıyordunuz ve boru |tüm bunları aynı hatta aldığından , bu satırdaki grepdosyayla eşleşir 1ve sonuç olarak bu satırı yazdırır. Ekranda gördüğünüz şey bu.

Böyle bir şey yaparken, satır başına 1 sonuçla sistem komutuna geri dönmek her zaman iyidir.

Takma adlardan kurtulmak için sadece yazın \lsve -1satır beslemelerine göre sonuçları yazdırmak için seçeneği kullanın.

$ \ls -1 | grep "1"
1
11

Not: ters eğik çizgi yöntemi her komutla çalışır, \commandyalnızca değiştirilmemiş sistem komutunu çağırır.

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.