xargs 공백 주의, grep 와 연계할 때 color 문제 등등.

다음 명령을 보자.

ls *.txt | xargs grep toast

위 명령은 확장자가 txt 인 문서를 나열한 뒤, xargs 로 그 파일을 매개변수화 하고, 그 파일내에 toast 라는 문구가 포함된 문서만 찾는 명령이다.

여기에, 두가지 문제가 있을 수 있다.

첫째, *.txt 파일 중, 파일명에 공백이 들어가 있다면 원하는 결과가 나오지 않거나, 오류가 발생할 수 있다.

두번째, grep 결과가 색깔로 구분되지 않을 수 있다.

첫번째 문제는, xargs 가 stdout -> stdin 전환 시에 구분자를 공백으로 쓰기 때문에 일어난다. 구분자를 ‘\n’ 등으로 바꿔주면 이 문제를 해결할 수 있다.

두번째는, alias 때문에 grep color 가 기본값인 줄로 착각을 했기 때문에 일어난다.

우분투는 기본 alias 로, alias grep='grep --color=auto' 를 포함한다.
그러나 xargs 뒤에 붙는 grep 는 alias 가 아니고 그냥 원래 grep 이기 때문에 색상 구분을 하지 않는다. 색상을 원한다면, 따로 넣어줘야 한다.

두가지 문제를 해결한(?) 최종 명령은 다음과 같다.

ls *.txt | xargs -d '\n' grep --color toast

xargs -d ‘\n’ 대신 xargs -0 도 된다고 하는 글을 읽었는데, 우분투 18.04 환경에선 제대로 되지 않았다. 좀 더 길고 잘 안외워지지만, -d ‘\n’ 에 친숙해지는 수밖에 없을 듯 하다.

안녕하세요. 글 남겨주셔서 고맙습니다.