패턴을 기반으로 특정 줄 번호를 출력합니다.

패턴을 기반으로 특정 줄 번호를 출력합니다.

2760줄의 파일이 있고 2740줄에 ID가 있습니다. 결과적으로 항상 맨 위에서 7행을 출력해야 합니다. 일부 파일에는 더 많은 행이 포함되고 일부 파일에는 더 적은 행이 포함되지만 출력은 항상 7행의 값입니다.

내가 사용하고 있는 것은 grep 'PATTERN' | sed -n '7p' yyyymmdd*.log패턴과 일치하는 것 같지만 디렉터리에서 찾은 첫 번째 파일의 7행을 출력합니다.

누구든지 나를 올바른 방향으로 밀어줄 수 있다면 감사하겠습니다.

답변1

특정 파일 이름 패턴과 일치하려면 각 입력 파일의 7행이 필요합니까?

awk 'FNR==7' file*

awk변수는 FNR현재 입력 파일의 줄 번호가 됩니다. 7이면 해당 행을 인쇄하십시오.

또는 GNU를 사용하십시오 sed.

sed -n -s '7p' file*

GNU sed옵션은 -s입력 파일 사이에서 내부 라인 카운터를 재설정하게 합니다(이것은 표준 GNU 확장입니다 sed).

일부 정규식을 기반으로 결과를 필터링해야 하는 경우 grep 'PATTERN'또는 다음을 통해 출력을 파이프하면 됩니다 awk.

awk 'FNR==7 && /PATTERN/' file*

또는 GNU를 사용하십시오 sed.

sed -n -s '7{/PATTERN/p}' file*

당신의 명령:

grep 'PATTERN' | sed -n '7p' yyyymmdd*.log

몇 가지 문제:

  1. input 이 없으면 grep표준 입력 스트림에서 입력을 기다립니다.
  2. sed전체 입력 파일 세트에서 라인 7만 선택됩니다(즉, 첫 번째 파일만) . 해당 라인 카운터는 파일 간에 재설정되지 않습니다. 위에서 언급했듯이 sed.-s
  3. 파이프의 두 부분이 연결되어 있지 않습니다. sed에서는 읽을 수 없습니다 grep.
  4. 불필요한 grep. 7행만 있으면 됩니다.

답변2

나는 노력할 것이다

awk '/PATTERN/ { c[FILENAME]++ ; if (c[FILENAME]==7) print ; } ' yyyymmdd*.log

어디

  • c[FILENAME]트릭은 각 파일의 7번째 줄을 선택합니다.

답변3

GNU를 사용하면 sed이것이 가능합니다. 예를 들어 PATTERN포함된 파일의 줄 번호 만 표시하려면 yyyymmdd*.log다음을 시도해 보세요.

sed -n '2740s/PATTERN/PATTERN/p' yyyymmdd*.log

이는 지정된 행 번호(2740)를 명령 앞에 붙이고 search일치하지 않는 한 출력을 억제합니다.sed-np

관련 정보