파일의 시작과 끝을 보는 Bash 방법

파일의 시작과 끝을 보는 Bash 방법

대기열 기반 클러스터에서는 보류 중인 작업의 대기열이 명령과 함께 표시됩니다(예: ) showqueue.

이 명령은 이름 등과 같은 열의 합리적인 데이터 목록을 반환하지만 열/데이터는 질문에 중요하지 않습니다.

watch나는 때때로 이 유틸리티를 사용하는 것을 좋아합니다 watch showqueue(별칭을 사용하여 alias watch="watch "내 명령의 별칭 확장을 강제로 감시). 처음 몇 행에는 중요한 데이터(실행 중인 작업), 보류 중인 작업 등이 있고 마지막으로 몇 가지 중요한 요약이 있습니다.

그러나 때때로 showqueue의 출력이 화면을 벗어나는 경우가 있습니다(믿을 수 없군요. 저도 알고 있습니다)! 이상적으로는 파일의 시작과 끝을 모두 볼 수 있는 방법을 갖고 싶습니다.

지금까지 내가 가진 것 중 최고는: showqueue > file; head -n 20 file > file2; echo "..." >> file2 ; tail -n 20 file >> file2; cat file2이고 watch별칭을 사용하는 것입니다.

더 유연하거나 간단한 유틸리티를 아는 사람이 있나요? 내 솔루션은 약간 나쁜 것으로 판명되었습니다. bash 루프는 "..."을 여러 줄로 만들었고 터미널 창 크기를 조정하는 데 전혀 적응하지 않았으며 더 많은 것을 놓쳤을 것입니다.

어떤 제안이 있으십니까?

답변1

다음과 비슷한 작업을 하시겠습니까? 머리와 꼬리의 출력을 표시합니다.

$ showqueue | (head && tail)

답변2

임시 파일을 사용하여 동일한 방법을 사용하지만 약간 더 짧습니다.

showqueue >/tmp/q.out; head -n 20 /tmp/q.out; echo '...'; tail -n 20 /tmp/q.out

이는 논의된 동일한 문제로 인해 어려움을 겪지 않습니다.다른 답변으로, 하지만회의출력이 40줄 미만인 경우 동일한 줄이 두 번 표시될 수 있습니다.

답변3

머리와 꼬리에서 원하는 수의 줄을 표시하는 awk 솔루션( n=3세트 번호 변경):

$ seq 99999 | awk -v n=3 'NR <= n; NR > n { a[NR] = $0; delete a[NR-n]; } 
     END { print "..."; for (i = NR-n+1; i <= NR; i++) if (i in a) print a[i]; }'
1
2
3
...
99997
99998
99999

쓰여진대로 머리와 꼬리는아니요입력이 2*n라인보다 짧은 경우에도 겹칩니다.

일부 awk 구현에서는 for (x in a) print a[x];in END부분을 사용하는 것도 가능합니다. 그러나 일반적으로 배열 항목을 올바른 순서로 반환한다는 보장은 없으며, 예를 들어 mawk의 경우는 그렇지 않습니다.

답변4

간단한 awk 스크립트를 사용할 수 있습니다. 마지막 3줄에 n=3인 순환 버퍼를 추가했습니다.

awk 'NR<=n {print $0} { A[NR%n]=$0 } END { for (i=1; i<=n; ++i) if (NR+i>2*n)print A[(NR+i)%n] }' n=3 < <( seq 10 )

업데이트 후에는 더 이상 간단하지 않습니다.

관련 정보