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
или любой другой инструмент?
Я собираю из комментариев, что вы хотите, чтобы вывод был похож на 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
Один из способов использования внешних переменных - это поместить 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