파일에서 줄의 마지막 열 인쇄


135

지속적으로 쓰거나 업데이트되는 파일이 있습니다. 특정 단어가 포함 된 마지막 줄을 찾은 다음 해당 줄의 마지막 열을 인쇄하고 싶습니다.

파일은 다음과 같습니다. 시간이 지남에 따라 더 많은 A1 / B1 / C1 라인이 추가됩니다.

A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434

나는 사용하려고

tail -f file | grep A1 | awk '{print $NF}'

값 766을 인쇄하지만 아무것도 출력되지 않습니다.

이것을 할 수있는 방법이 있습니까?

답변:


199

버퍼링으로 인해 아무것도 보이지 않습니다. 충분한 행이 있거나 파일 끝에 도달하면 출력이 표시됩니다. tail -f는 더 많은 입력을 기다리는 것을 의미하지만 더 이상 라인이 없으므로 file파이프 grep가 닫히지 않습니다.

출력 -f에서 생략하면 tail즉시 표시됩니다.

tail file | grep A1 | awk '{print $NF}'

@EdMorton은 물론입니다. Awk 도 검색 할 수 A1있어 명령 줄이 단축됩니다.

tail file | awk '/A1/ {print $NF}'

또는 꼬리없이, 포함하는 모든 줄의 마지막 열을 보여줍니다. A1

awk '/A1/ {print $NF}' file

@MitchellTracy의 의견 덕분에 tail포함 된 레코드가 누락 A1되어 결과가 전혀 출력되지 않을 수 있습니다. 이는 파일을 먼저 검색 한 다음 마지막 줄만 표시하여 전환 tail하여 해결할 수 있습니다 awk.

awk '/A1/ {print $NF}' file | tail -n1

14
awk가 자체 RE 비교를 수행 할 수 있기 때문에 grep + awk가 필요하지 않습니다. "grep A1 | awk '{print $ NF}'"는 "awk '/ A1 / {print $ NF}'"이어야합니다. 또한 tail -f를 사용하지 않으면 꼬리가 전혀 필요하지 않습니다. yoiu는 다음을 수행 할 수 있습니다. awk '/ A1 / {f = $ NF} END {print f}'file
Ed Morton

raw가 tail제공 하는 창에 열이 나타나지 않을 수 있기 때문에 이것은 옳지 않습니다 . 특정 빈도로 표시 될 것을 알지 못하면보다 안전합니다 awk '/A1/ {print $NF}' file | tail -n1.
Mitchell Tracy


12

한 가지 방법으로 awk:

tail -f file.txt | awk '/A1/ { print $NF }'

나는 그것이 게시 된 문제 (+ 1!)에 대한 올바른 해결책이라고 생각했지만 이제는 질문을 이해하지 못합니다. OP는 파일의 마지막 라인에서 마지막 필드를 원하지만 tail -f를 사용하는 경우 마지막 라인이 없습니다. 어쩌면 그는 파일의 마지막 줄을 의미합니다.이 경우 다른 의견 중 하나를 봅니다.
Ed Morton

아주 좋고 간단합니다. 엄지 손가락. awk의 암호 구문에 대한 거절 :)
Stamster

11

약간의 파이프만으로도이 작업을 수행 할 수 있습니다.

tac file | grep -m1 A1 | rev | cut -d' ' -f1 | rev

이렇게하면 문제가 해결되지만 실제로 awk를 사용하지는 않습니다. 어쨌든 당신에게 충분하기를 바랍니다.
miono

4

어쩌면 이것이 효과가 있습니까?

grep A1 file | tail -1 | awk '{print $NF}'

2

당신은 모든 것을 할 수 있습니다 awk:

<file awk '$1 ~ /A1/ {m=$NF} END {print m}'

1
split () 및 배열이 필요하지 않습니다. 마지막 필드를 저장하고 다음과 같이 인쇄하십시오. awk '/ A1 / {f = $ NF} END {print f}'파일
Ed Morton

2

펄 사용하기

$ cat rayne.txt
A1 123 456
B1 234 567
C1 345 678
A1 098 766
B1 987 6545
C1 876 5434


$ perl -lane ' /A1/ and $x=$F[2] ; END { print "$x" } ' rayne.txt
766

$

너무 복잡해 보이면됩니다perl -lane 'print $F[2] if /A1/' rayne.txt
Hi-Angel

1
@ Hi-Angel ..이 질문은 A1의 마지막 발생을 요구합니다. 당신의 대답은 모든 경기를 인쇄합니다. btw 당신이 나의 대답을 좋아한다면, pls upvote
stack0114106

1

awk -F " " '($1=="A1") {print $NF}' FILE | tail -n 1

awk필드 구분 기호 -F 를 공백 ""으로 설정하여 사용하십시오 .

pattern $1=="A1"action을 사용하면 {print $NF}첫 번째 필드가 "A1"인 모든 레코드의 마지막 필드가 인쇄됩니다. 결과를 꼬리에 파이프하고 -n 1옵션을 사용 하여 마지막 줄만 표시하십시오.


0

파일에서 이것을 실행하십시오 :

awk 'ORS=NR%3?" ":"\n"' filename

그리고 당신은 당신이 찾고있는 것을 얻을 것입니다.


0

실제 문제는 아니지만 일부 도움이 될 수 있습니다 awk "{print $NF}". awk '{print $NF}'쉘이 확장되지 않도록 해야합니다 $NF.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.