다음 줄을 포함하는 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