Возвращайте определенные поля, если соответствует дате

2017-11-27 20:11:13,632 INFO abc: [java: Thread-389579]: Completed executing command 2017-11-27 20:11:13,632 INFO abc: [java: Thread-389579]: OK 2017-11-27 20:11:13,632 INFO abc: [java: Thread-389579]: <completed> 2017-11-27 20:11:13,632 INFO abc: [java: Thread-389579]: release for adeo/student

Мои подходы:

awk 'today="$(date +'%Y-%m-%d')" ($1 = today) && /Completed executing command/ {cnr = NR} NR == (cnr+3) {gsub(/\/.*/,"",$NF); print $NF}' filename awk 'today="$(date +'%Y-%m-%d')" ($1 == today) && /Completed executing command/ { cnr = NR } NR == (cnr+3) { sub("/.*","",$NF); print $NF }' filename

Мы хотим напечатать только adeo и student в двух разных переменных. Условие - если $ 1 равно текущей дате, тогда он должен искать Completed executing command во всем файле, а затем пропускать две строки, а затем печатать adeo и student. (Название adeo / student не исправлено, поэтому в приведенном выше случае мы хотим adeo и student, но если есть другое имя, это должно появиться вместо этого).

Из нашего подхода мы получаем только adeo. Как мы можем достичь этого, используя awk / sed / grep или любой другой инструмент?

3
задан 29 November 2017 в 13:15

6 ответов

Я получаю из комментариев, что вы хотите, чтобы результат выглядел как name1=adeo name2=student. Если это так, попробуйте:

$ awk -v today="$(date +'%Y-%m-%d')"  '$1 == today && /Completed executing command/ { cnr = NR } cnr && NR == cnr+3 {sub(/\//, " name2=", $NF); print "name1="$NF }' filename
name1=adeo name2=student
3
ответ дан 22 May 2018 в 15:50

Я получаю из комментариев, что вы хотите, чтобы результат выглядел как name1=adeo name2=student. Если это так, попробуйте:

$ awk -v today="$(date +'%Y-%m-%d')" '$1 == today && /Completed executing command/ { cnr = NR } cnr && NR == cnr+3 {sub(/\//, " name2=", $NF); print "name1="$NF }' filename name1=adeo name2=student
3
ответ дан 18 July 2018 в 02:27

Я получаю из комментариев, что вы хотите, чтобы результат выглядел как name1=adeo name2=student. Если это так, попробуйте:

$ awk -v today="$(date +'%Y-%m-%d')" '$1 == today && /Completed executing command/ { cnr = NR } cnr && NR == cnr+3 {sub(/\//, " name2=", $NF); print "name1="$NF }' filename name1=adeo name2=student
3
ответ дан 24 July 2018 в 17:34

Один из способов, по которым вы можете обратиться с использованием внешних переменных, - это помещение today в среду и использование ENVIRON["today"] в awk. Использование gsub() также не нужно, если вы хотите просто получить имя и часть учащегося, и если они всегда будут последним элементом в строке.

$ today=$(date +'%Y-%m-%d') awk '$1 = ENVIRON["today"] && /Completed executing command/ {cnr = NR} NR == (cnr+3) {print $NF}' input.txt                                
adeo/student
2
ответ дан 22 May 2018 в 15:50

Один из способов, по которым вы можете обратиться с использованием внешних переменных, - это помещение today в среду и использование ENVIRON["today"] в awk. Использование gsub() также не нужно, если вы хотите просто получить имя и часть учащегося, и если они всегда будут последним элементом в строке.

$ today=$(date +'%Y-%m-%d') awk '$1 = ENVIRON["today"] && /Completed executing command/ {cnr = NR} NR == (cnr+3) {print $NF}' input.txt adeo/student
2
ответ дан 18 July 2018 в 02:27

Один из способов, по которым вы можете обратиться с использованием внешних переменных, - это помещение today в среду и использование ENVIRON["today"] в awk. Использование gsub() также не нужно, если вы хотите просто получить имя и часть учащегося, и если они всегда будут последним элементом в строке.

$ today=$(date +'%Y-%m-%d') awk '$1 = ENVIRON["today"] && /Completed executing command/ {cnr = NR} NR == (cnr+3) {print $NF}' input.txt adeo/student
2
ответ дан 24 July 2018 в 17:34

Другие вопросы по тегам:

Похожие вопросы: