왜 파이프 명령“l | grep”1“”이 잘못된 결과를 얻습니까?


13

그림과 l같이 현재 폴더에 파일을 가져 오는 데 사용 합니다. 그리고 번호가있는 파일을 가져 오려고 1하므로 pipeand을 사용 합니다 grep.

그러나 왜 2and 22파일이 표시됩니까? 그리고 무엇 1;34m입니까?

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

최신 정보

lzshrc파일에 명령의 별칭을 이미 지정했습니다.

 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
텍스트 스크린 샷을 게시하지 마십시오. 여기에 텍스트를 복사하고 코드 형식을 적용하십시오.
muru

@muru 나는 ​​당신이 게시물 출력을 요구하는 것 같아 type -a l?
WinEunuuchs2Unix

@ WinEunuuchs2Unix 아, 예.
muru

@Lee type ls명령 출력을 게시하라고 요청할 수 있습니까? ls어떤 식 으로든 별칭 을 수정 했습니까?
Sergiy Kolodyazhnyy

@Serg는 이미 업데이트되었습니다.
Lee

답변:


27

우선, 당신이하려는 일 l| grep <filename>이 나쁩니다. 하지마 이유는 다음과 같습니다.

l 명령은 실제로 별칭입니다 ls -CF

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

우분투에서 기본적으로 bash, ls별칭입니다 ls --color=auto. 의견에서 지적한 스틸 드라이버는 채색 --color=auto을 해제해야합니다. 특정 경우에는 기본적으로 alias ls="ls -alh --color"and 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

쉘 glob과 현대적인 테스트 [[명령으로 다음 과 같은 작업을 수행 할 수 있습니다 .

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

또는 bash혼자서 보다 파일 이름 처리 기능이 훨씬 뛰어난 파이썬을 사용하십시오.

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

의 출력을 처리 할 필요가 없으면 ls간단한 globbing으로 ls도 작업을 수행 할 수 있습니다. (이것은 출력 텍스트를 다루기 위해 다른 프로그램으로 전달하는 것이 아니라 파일 목록을보기위한 것입니다)

bash-4.3$ ls *1*
1.txt

2
나는 또한 별칭의 일부로 또는 자체 의 이전 별칭으로 (기본값을 대체하여 ) 지정된 경우 에만 파이프에서 색상 이 표시 된다고 생각합니다 . --color=alwaysllsalias ls='ls --color=auto'
스틸 드라이버

@steeldriver 좋은 지적이지만 lsbash의 기본 설정은 무엇입니까? type ls이 별칭을의 저를 준다ls --color=auto
세르지 Kolodyazhnyy

1
예, 이것이 기본값이지만 auto파이프 AFAIK에서 색상이 꺼집니다. ANSI 컬러 시퀀스를보고하기 위해,이 변경되어 있어야합니다 --color=always에 하나, ls별명 또는 l별칭
steeldriver

아 무슨 말인지 알 겠어 매우 이상합니다.
Sergiy Kolodyazhnyy

@steeldriver 그래서 나는 그의 별칭을 게시하도록 OP에게 요청했고 분명히 그들이 가지고있는 것, 즉 채색을 ls --color막지 않습니다 (나 자신도 테스트했습니다). 이에 따라 내 답변을 업데이트
Sergiy Kolodyazhnyy

6

귀하 lls명령은 별명으로 설정됩니다.

grep "1"(을 사용하여 |) 출력을 파이프로 연결하면 1표시 되는 각 화면 라인이 1빨간색으로 표시됩니다 .

파일 이름이 있기 때문에 ., .., 222같은 화면 행에 표시, 그들에 의해 출력 grep뿐만 아니라하지만 빨간색하는 쇼의에 표시되지 않습니다 grep일치.

:34m제대로 페인트하지 않는 색상에 대한 이스케이프 시퀀스입니다. 의 출력 수정 된 질문을 바탕으로 type -a l하고 type -a그것은 내 시스템에서 재현 할 수 있습니다. 별칭을 다음 --color으로 변경해야 합니다 --color=auto.

컬러 출력

컬러 LS


1:34m가지 텍스트의 컬러화에 사용 그들이있는 거 이스케이프 시퀀스, 손상되지 않습니다. 그 부분에 대한 내 대답을 참조하십시오;)
Sergiy Kolodyazhnyy

@Serg 감사합니다. 별칭으로 OP 수정 된 질문을 기반으로 수정했습니다.
WinEunuuchs2Unix

1

당신의 시험에서, 당신은 당신의 ls별명 이라고 부르고 , 따라서 1;34m채색에서 나오는 비슷한 소음을 냅니다. 그리고 파이프 |는이 줄을 모두 같은 줄에 수신하기 때문에 그 줄 grep의 파일과 일치하여 1결과적으로이 줄을 인쇄합니다. 이것이 화면에 보이는 것입니다.

그런 일을 할 때는 항상 라인 당 1 개의 결과로 시스템 명령으로 돌아가는 것이 좋습니다.

별명을 제거하려면을 입력 \ls하고 옵션 -1을 사용하여 줄 바꿈으로 구분 된 결과를 인쇄하십시오.

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

참고 : 백 슬래시 메소드는 모든 명령에서 작동 \command하며 별명을 지정하지 않은 시스템 명령 만 호출합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.