Друк останнього стовпця рядка у файлі


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
Вам ніколи не потрібні grep + awk, оскільки awk може це зробити власне порівняння RE. "grep A1 | awk '{print $ NF}'" повинен бути просто "awk" / A1 / {print $ NF} '". Крім того, якщо ви не використовуєте хвостик -f, то вам взагалі не потрібен хвіст, yoiu може просто зробити: awk '/ A1 / {f = $ NF} END {print f}' файл
Ед Мортон

Це не зовсім правильно, оскільки стовпець може не з’являтися у вікні, яке tailдає вам сировина . Якщо ви не знаєте, що це з'явиться з певною частотою, було б безпечнішеawk '/A1/ {print $NF}' file | tail -n1 .
Мітчелл Трейсі


12

Один із способів використання awk:

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

Я думав, що це правильне рішення опублікованої проблеми (+1!), Але тепер я бачу, що не розумію питання. ОП бажає останнього поля з ОСТАНОЇ ЛІНІЇ файлу, але немає ОСТАНОЇ ЛІНІЇ, якщо використовується хвіст -f Можливо, він має на увазі останній рядок СУЧАСНО у файлі, і в цьому випадку див. Один з моїх інших коментарів.
Ед Мортон

Дуже добре і просто. Пальці вгору. Великі пальці вниз для 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}' file
Ed Morton

2

Використання Perl

$ 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
Привіт-Ангел

1
@ Привіт-Ангел .. питання задає останнє виникнення A1. Ваша відповідь надрукує всі відповідники .. btw, якщо вам подобається моя відповідь, pls піднесіть її
stack0114106

1

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

Використовуйте awkз роздільником поля -F, встановленому пробілом "".

Використовуйте шаблон $1=="A1" і дію {print $NF} , це надрукує останнє поле у ​​кожному записі, де першим полем є "А1". Складіть результат у хвіст і скористайтеся -n 1опцією, щоб показати лише останній рядок.


0

Виконайте це у файлі:

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

і ви отримаєте те, що шукаєте.


0

Тут не актуальна проблема, але може допомогти хтось із них: я робив awk "{print $NF}", зверніть увагу на неправильні цитати. Потрібно awk '{print $NF}', щоб оболонка не розширювалася $NF.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.