パイプコマンド「l | grep” 1””は間違った結果を得る?


13

図が示すようlに、現在のフォルダー内のファイルを取得するために使用します。そして、番号付きのファイルを取得したい1ので、pipeとを使用しgrepます。

しかし、なぜ2and 22ファイルが表示されるのでしょうか?そして何1;34mですか?

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

更新

l私のzshrcファイルにはすでにコマンドのエイリアスがあります。

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

typeコマンドの結果は次のとおりです。

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

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

4
テキストのスクリーンショットを投稿しないでください。ここにテキストをコピーし、コードのフォーマットを適用します。
ムル16

@muruの投稿出力を依頼するつもりだったと思いますtype -a lか?
WinEunuuchs2Unix 16

@ WinEunuuchs2Unixああ、はい。
ムル16

@Lee type lsコマンドの出力を投稿してください。lsエイリアスを修正しましたか?
セルギーKolodyazhnyy 16

@Sergはすでに更新されています。
リー

回答:


27

まず第一に、あなたがやろうとしていることl| grep <filename>は悪いことです。しないでください。その理由は次のとおりです。

l コマンドは実際にはエイリアスです ls -CF

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

Ubuntuのではデフォルトではbashlsへのエイリアスですls --color=auto。スチールドライバーがコメントで指摘したように、--color=auto色付けをオフにすることになっています。あなたの特定のケースでは、あなたが持っているalias ls="ls -alh --color"alias l="ls -CF"基本的になってしまうました、ls -alh --color -CF。この特定のスイッチの組み合わせは、パイプを介して色付き出力を送信します。例えば:

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

.および..ディレクトリのエスケープシーケンスが同じであることに注意してください。

これはどういう意味ですか

これは、lファイルの種類に応じてファイルの色付きリストを出力することを意味します。問題は、エスケープシーケンスを使用すると色付けが発生することです。それが1:34m物事です-それらは特定の色のエスケープシーケンスです。

主な問題は、前述のようなエスケープシーケンスや他の特殊文字が許可されているためにls、解析がスクリプトの誤った出力や災害につながることが多いことlsです。詳細については、この記事を参照してください:http : //mywiki.wooledge.org/ParsingLs

あなたがすべきこと:

findコマンドを使用:

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

シェルグロブと最新のテスト[[コマンドを使用すると、次のようなことができます。

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

または、bash単独で使用するよりもはるかに優れたファイル名処理機能を持つpythonを使用することもできます

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

の出力を処理する必要がない場合はls、単純なグロブでls作業を行うこともできます。(これはファイルのリストを表示するためだけであり、出力テキストを処理するために別のプログラムに渡すためではありません)

bash-4.3$ ls *1*
1.txt

2
出力は、別名の一部として、またはそれ自体の以前の別名のいずれかで(デフォルトを置き換えて)指定されている場合にのみ、パイプで色付けれると思います。--color=alwaysllsalias ls='ls --color=auto'
スチールドライバー16

@steeldriver良い点lsですが、デフォルトでbashにあるのはそうではありませんか?type lsそれはの別名だと私に与えますls --color=auto
Sergiy Kolodyazhnyy

1
はい、これautoがデフォルトです-しかし、パイプAFAIKの色をオフにします。ANSIカラーシーケンスを見ることになるためには、それに変更されていなければならない--color=alwaysのいずれかで、lsエイリアスまたはlエイリアス
steeldriver

ああ、私はあなたが何を意味するかわかります。それは非常に奇妙です。
セルギーKolodyazhnyy 16

@steeldriverだから、私はOPに彼のエイリアスを投稿するように要求しました、そして、明らかに、彼らが持っているもの、すなわちls --color、色付けを妨げません(私自身もテストしました)。それに応じて私の答えを更新しました
セルギーKolodyazhnyy

6

あなたllsコマンドは、エイリアスとして設定されています。

それらを実行すると、表示される各画面行がgrep "1"(を使用して|)パイピング1され、1赤色で表示されます。

ファイル名なので...222同じ画面行に表示され、彼らはによって出力されるgrepだけでなくが、赤たショーには表示されませんgrep試合。

:34m正しく描画されません色のエスケープシーケンスです。出力を使用して改訂された質問をもとにtype -a lしてtype -a、それは私のシステムで再生することができます。エイリアスをから--colorに変更する必要があることに注意してください--color=auto

カラー出力

カラーls


1:34m物事は彼らが、テキストのカラー化のために使用されているエスケープシーケンス破損はありません。その部分の私の答えを参照してください;)
セルギーコロディアズニー

@Sergありがとう。OPのエイリアスのある質問に基づいて改訂しました。
WinEunuuchs2Unix 16

1

トライアルでは、lsエイリアスを呼び出していたため、1;34mカラーリングから発生する類似のノイズが発生しました。パイプ|はこれをすべて同じ行で受信するため、その行grepのファイルと一致し、1結果としてこの行を出力します。これは画面に表示されるものです。

あなたがそのようなことをしているとき、1行につき1つの結果でシステムコマンドに戻ることは常に良いことです。

エイリアスを削除\lsするには、と入力するだけで-1、改行で区切られた結果を出力するオプションを使用します。

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

注:バックスラッシュメソッドはすべてのコマンドで機能し\command、エイリアスされていないシステムコマンドを呼び出すだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.