awk는 매개변수 위의 모든 줄과 일치합니다.

awk는 매개변수 위의 모든 줄과 일치합니다.

다음 줄을 포함하는 test.out이라는 파일이 있습니다.

-rw-rw----    1 informix informix    9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw----    1 informix informix    8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw----    1 informix informix    9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw----    1 informix informix    9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw----    1 informix informix    9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw----    1 informix informix   10655940 Jan 21 05:59 shop4_0_Log0000331880.Z
-rw-rw----    1 informix informix   10832325 Jan 21 06:39 shop4_0_Log0000331881.Z
-rw-rw----    1 informix informix    8521443 Jan 21 07:42 shop4_0_Log0000331882.Z
-rw-rw----    1 informix informix   10283566 Jan 21 08:02 shop4_0_Log0000331883.Z
-rw-rw----    1 informix informix   10633957 Jan 21 08:51 shop4_0_Log0000331884.Z

grep value 331881 매개변수 위의 모든 줄을 인쇄하고 싶습니다.

내가 원하는 결과는 다음과 같아야 합니다.

-rw-rw----    1 informix informix    9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw----    1 informix informix    8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw----    1 informix informix    9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw----    1 informix informix    9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw----    1 informix informix    9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw----    1 informix informix   10655940 Jan 21 05:59 shop4_0_Log0000331880.Z

다음 명령을 사용하면 인쇄할 줄 수를 지정할 수 있습니다.

grep -n 331881 test.out | cut -d':' -f1 |  xargs  -n1 -I % awk "NR<=%+0 && NR>=%-1" test.out | sed '$d'

위 명령은 지정된 줄 수(이 경우 1줄)만 인쇄하지만 grep 줄 위의 모든 내용을 인쇄하도록 위의 명령을 변경하고 싶습니다. 나는 내 문제에 대한 해결책이나 더 쉬운 방법을 찾으려고 노력하고 있습니다.

답변1

나열된 파일이 포함된 디렉토리에 있다고 가정하고 다음을 사용하십시오 zsh.

ls -ld shop4_0_Log<331882->.Z

331882 이상의 정수와 일치하는 특정 glob <331882->입니다 .zsh

다른 쉘을 사용하십시오.

for name in shop4_0_Log*.Z; do
    number=${name#shop4_0_Log}
    number=${number%.Z}

    if [ "$number" -ge 331882 ]; then
        ls -ld "$name"
    fi
done

shop4_0_Log여기서는 로 시작하고 끝나는 이름을 반복합니다 .Z. 이러한 각 이름에 대해 파일 이름의 정수 부분을 선택하고 331882 이상이면 ls -ld해당 이름을 호출합니다.

선행 0으로 인해 쉘이 특정 숫자를 8진수로 해석하게 되면(내 테스트에서는 그렇지 않음) 10#$number테스트에서 를 사용하면 숫자가 10진수 정수로 해석됩니다(이것은 및 일부 다른 쉘에서 지원됩니다 ksh) bash.

두 변형 모두 일부 출력이 포함된 텍스트 파일의 존재에 의존하지 않습니다 ls.

관련된:

답변2

awk를 직접 사용할 수 있다고 생각합니다.

awk '/331881/ { exit } 1' test.out

그러면 모든 줄이 인쇄되지만 일치하는 줄은 331881종료됩니다 .

답변3

또 다른 좋은 도구는 다음과 같습니다 sed.

sed -n '/shop4_0_Log0000331881\.Z$/q;p' test.out

답변4

j=`awk '/331881/{print NR}' file`

awk -v j="$j" '{a[++i]=$0}/331881/{for(x=NR-j;x<NR;x++)print a[x]}' file

산출

-rw-rw----    1 informix informix    9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw----    1 informix informix    8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw----    1 informix informix    9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw----    1 informix informix    9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw----    1 informix informix    9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw----    1 informix informix   10655940 Jan 21 05:59 shop4_0_Log0000331880.Z

관련 정보