파일의 마지막 구분 기호 뒤의 모든 데이터를 인쇄하는 방법은 무엇입니까? 파일 데이터는 다음과 같습니다.
data1
data2
######################
data3
data4
######################
data5
data6
인쇄하고 싶습니다:
data5
data6
#####################은 구분 기호이기 때문입니다.
*
행 수를 알 수 없습니다.
나는 시도했다:
$ cat file | awk -F "#" '{print $NF}'
그러나 출력은 다음과 같습니다.
data1
data2
data3
data4
data5
data6
답변1
awk
다음과 함께 사용하세요 tac
(일부 시스템에도 tail -r
이 기능이 있음):
$ tac file | awk '/^#+$/{exit} 1' | tac
data5
data6
tac
또는 아직 /가 없으면 tac
비슷한 함수를 직접 작성하세요 tail -r
(이는 cat
비표준 -n
옵션을 지원한다고 가정하고, 지원하지 않으면 awk -v OFS='\t' '{print NR, $0}'
대신 사용하세요 cat -n
).
$ mytac() { cat -n -- "$@" | sort -rn | cut -f2-; }
$ mytac file | awk '/^#+$/{exit} 1' | mytac
data5
data6
awk
또는 하나도 없고 직접 작성하고 싶지 않은 경우 tac
둘 중 하나를 단독으로 사용하십시오 .
$ awk '{rec=rec $0 ORS} /^#+$/{rec=""} END{printf "%s", rec}' file
data5
data6
또는 파일이 모든 것을 한 번에 메모리로 읽을 수 있을 만큼 작은 경우 awk
다중 문자에 GNU를 사용하십시오.RS
$ awk -v RS='^$' -v ORS= -F'(^|\n)#+(\n|$)' '{print $NF}' file
data5
data6
또는 GNU awk를 다시 사용하여 다중 문자 RS를 수행하고 END 부분의 마지막 $0 값을 유지합니다.
$ awk -v RS='(^|\n)#+(\n|$)' -v ORS= 'END{print}' file
data5
data6
위의 모든 기능은 입력이 파일에 저장되어 있는지 또는 파이프에서 나오는지 여부에 관계없이 작동합니다. 왜냐하면 입력을 한 번만 읽기 때문입니다. 파일에 저장되어 있어 두 번 읽을 수 있는 경우 다양한 도구 조합을 사용하여 다음과 같은 다양한 옵션을 사용할 수 있습니다.
$ tail -n +"$(awk '/^#+$/{n=NR} END{print n+1}' file)" file
data5
data6
1 그러나 검색할 수 없는 파일(예: 파이프)의 경우 입력은 tac
//를 통해 메모리에 tail -r
임시 저장되거나 sort
임시 파일에 저장되어야 합니다. 일부 시스템에서는 tail -r
(메모리에) 저장하려는 양에 대한 제한이 상대적으로 낮습니다.
답변2
GNU 사용 awk
:
awk 'BEGIN{FS="######################\n"; RS=""} {print $NF}' file
산출:
데이터 5 데이터 6
$NF
마지막 열을 포함합니다.
바라보다:8개의 강력한 awk 내장 변수 – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
답변3
다음은 독특한 한 줄입니다.
tail -n+$(( $(grep -nF '######################' test.txt | tail -1 | cut -d: -f1) + 1)) test.txt
그리고 좀 더 합리적인 별도의 설명
last_delimiter_line=$(grep -nF '######################' test.txt | tail -1 | cut -d: -f1)
data_line_num=$((last_delimiter_line + 1))
tail -n+$data_line_num test.txt
- 파일에서 모든 구분 기호를 검색
grep
하고 일치하는 각 항목과 찾은 줄 번호를 인쇄합니다. tail
마지막 게임 빼고 모두 삭제cut
발견된 마지막 구분 기호의 줄 번호를 추출합니다 .last_delimiter_line
- 인쇄할 첫 번째 줄은 다음과 같
last_delimiter_line
으며 다음과 같이 저장됩니다.data_line_num
- 마지막
tail
명령은 test.txt 줄부터 시작하는 모든 내용을 인쇄합니다.data_line_num