셸에서 출력 추출

셸에서 출력 추출

내가 하는 동안

ls -la |grep -e Aug

내가 얻는 결과는 다음과 같습니다.

-rw-r--r--    1 root           staff   454 Oct 15 18:35 Aug.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 25 04:00 abc7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 26 07:00 def7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 27 10:00 ghi7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 28 13:00 jkl7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 29 16:00 mno7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 30 19:00 pqr7.txt

10월에 생성된 첫 번째 파일이 아닌 8월에 생성된 파일만 나열하고 싶습니다. 다음이 출력되어야 합니다.

-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 25 04:00 abc7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 26 07:00 def7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 27 10:00 ghi7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 28 13:00 jkl7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 29 16:00 mno7.txt
-rwxr-xr-x@   1 PrashastKumar  staff     0 Aug 30 19:00 pqr7.txt

또한 하드코딩된 값이 아닌 사용자 입력으로 월을 갖고 싶습니다.

답변1

대안을 고려해야 합니다분석하다ls,지금 바로여러 가지 함정이 가득. 그러나 여기에서 귀하의 주요 관심은 열을 기준으로 필터링하는 방법인 것 같고 최종 목표는 ls 어쨌든 구문 분석이 아닐 것이므로 계속해서 귀하가 사용하고 있는 예( 를 사용 ls)를 따르겠습니다. 하지만 이것이 ls출력을 구문 분석하는 것이 좋은 것이라고 생각하지 마십시오. 이는 일반적으로 좋은 일이 아닙니다.

grep을(를) 검색 하면 Aug연속적으로 아무 곳에서나 검색하게 됩니다. 실제로 Aug위치가 포함된 행을 선택하는 것이 아니라 여섯 번째 열의 완전하고 정확한 텍스트로 포함된 행만 선택하고 싶을 것 입니다. 비록 당신은할 수 있는이렇게 하는 것이 grep더 쉽고 자연스럽습니다 awk.

ls -la | awk '$6 == "Aug"'

어떤 이유로든 당신이진짜이렇게 하려면 다음을 grep수행할 수 있습니다.

ls -la | grep -E '(\S+\s+){5}Aug\s'

누구세요또한 관심이 있습니다여섯 번째 열이 읽은 셸 변수의 값과 동일한 행을 필터링합니다 month. 당신은 이것이 효과가 있다는 것을 관찰했습니다아니요일하다:

ls -la | awk '$6 == "$month"'   # does not work

작동하지 않는 이유는아포스트로피AWK 스크립트 주변의 $6 == "$month"셸 실행 방지매개변수 확장$month해당 값으로 바꾸 십시오. 텍스트는 $month있는 그대로 전달되는데 awk, 이는 원하는 내용이 아닙니다.AWK 변수와 쉘 변수는 완전히 별개입니다.awk이 문제를 해결하는 깨끗하고 간단한 방법은 명령 의 옵션을 사용하여 쉘 변수에서 AWK 변수를 초기화하는 것입니다 -v.

ls -la | awk -v m="$month" '$6 == m'

원하는 경우 AWK 변수의 이름을 쉘 변수와 동일한 이름으로 지정할 수 있습니다. 동일한 것을 나타내는 경우 이는 합리적인 선택입니다. m쉘 변수와 AWK 변수가 어떻게 분리되는지 설명하고 혼동을 피하기 위해 AWK 변수의 이름을 지정했습니다 . (길거나 복잡한 AWK 스크립트 또는 변수가 많은 스크립트의 경우 .보다 더 설명적인 방식으로 변수 이름을 지정할 수 있지만 m이 경우 가독성이 저하되지는 않습니다.)


위에 주제를 링크했어요배쉬 참조 매뉴얼귀하가 질문에 태그를 지정했기 때문에가장 오래된 버전의 OS X(현재 macOS라고 함) 를 제외한 모든 버전의 기본 셸은 입니다 bash.tcsh

참고로, month명령을 사용하여 값을 input 으로 사용한다고 언급하셨습니다 read month. 쉘의 명령을 사용할 때 , 대신 쓰기 위해 read거의 항상 이 플래그를 전달해야 합니다 . 생략하는 경우 에만-rread -r month-r생각하다read\수신된 입력에서 이스케이프된 명령을 변환합니다 (실제로는 이를 원하지 않습니다). IFS= read -r month선행 및 후행 공백이 제거되지 않도록 사용할 수도 있습니다 . 하지만 이 경우 실제로 제거하고 싶을 수도 있으므로 생략할 수 있습니다 IFS=.

답변2

이것은 나에게 효과적입니다

ls -al | awk '$6 == "Aug" {print}'

관련 정보