마지막 구분 기호 뒤의 모든 데이터를 인쇄합니다.

마지막 구분 기호 뒤의 모든 데이터를 인쇄합니다.

파일의 마지막 구분 기호 뒤의 모든 데이터를 인쇄하는 방법은 무엇입니까? 파일 데이터는 다음과 같습니다.

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

관련 정보