단일 열에서 grep을 실행하는 방법은 무엇입니까?


42

ls -l명령 의 출력을 grep하고 싶습니다 .

-rw-r--r--   1 root root       1866 Feb 14 07:47 rahmu.file
-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

grep rahmu$ 3 열에서만 실행하고 싶으 므로 grep명령 출력 은 다음과 같습니다.

-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

가장 간단한 방법은 무엇입니까? 대답은 리눅스와 솔라리스에 중점을 둔 많은 Unices에서 이식 가능해야합니다.

NB : 특정 사용자에게 속한 모든 파일을 찾는 방법을 찾고 있지 않습니다. 이 예는 내 질문을 더 명확하게하기 위해 제공된 것입니다.


5
출력 결과ls파싱하는 것은 본질적으로 취약합니다 (사용자 이름에 공백이 있으면 어떻게되는지 생각하십시오. 예, 일부 플랫폼에서 발생합니다). find대신 사용하십시오 .
Gilles 'SO- 악마 그만'

이 제목의 질문에 대답하지 않지만, 나는 언급하겠습니다 --printf옵션을 stat사용하면 다른 구문 분석하는 것이 좋습니다 장소에서 편리하게 사용할 수 있습니다 ls. 그러나 일반적으로 find원하는 것입니다 (@ Giles가 언급했듯이).
와일드 카드

답변:


49

한 번 더 시간이 awk절약됩니다!

비교적 간단한 구문을 사용하여 간단하게 수행 할 수 있습니다.

ls -l | awk '{if ($3 == "rahmu") print $0;}'

또는 더 간단합니다 : (Peter.O에게 의견에 감사드립니다)

ls -l | awk '$3 == "rahmu"' 

9
또는 : ls -l | awk '$3=="rahmu"'그리고 그런데 오프닝 (브래킷은 다음에 와야합니다 if.awk '{if($3 ...'
Peter.O

3
나에게서 @ Peter.O +1. 인쇄가 awk 일치의 기본값이므로 명령이 더 간결하고 정확합니다.
bsd

현지화 문제 (날짜 형식이 열 순서에 영향을 미침)를 피하기 위해 표준 형식과 언어를 확인하는 것이 좋습니다.LANG=C ls -l | awk ...
fheub


11

열별, 고정 크기 열을 의미하는 경우 다음을 수행 할 수 있습니다.

ls -l | grep "^.\{15\}rahmu"

여기서 ^줄의 시작을 .의미하고 모든 문자를 \{15\}의미하며 이전 문자 (이 경우 모든 문자)가 정확히 15 번 발생합니다.


2

나는 파티에 늦었다는 것을 알고 있지만이 문제에 대한 매우 일반적인 해결책은 정규식과 함께 awk를 사용하는 것입니다.

awk '$3~/rahmu/{print}' input_file

'//'로 묶인 부분은 모든 종류의 정규식이 될 수 있습니다.


1

단일 사용자 이름 열을 기반으로 grep하고 파일 만 인쇄하려면 다음을 시도하십시오.

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

디렉토리의 경우 remove -로 변경 d하십시오 -.

기본적으로 \S\+\s\+공백이 아닌 문자와 공백 문자가 일치하는 각 열을 선택 하므로 세 개의 첫 번째 열과 사용자 이름이 일치합니다.

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