Это мой пример файла журнала, который я хотел бы извлечь из очень большого файла журнала
2017-05-30 23:11:34,629 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking auth agent [accountName=rene1 remoteAddress=STEDGE/172.16.8.3]
2017-05-30 23:11:14,638 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - SSH: Failed login attempt on [172.16.8.1]. Username: "rene1".
2017-05-30 23:10:54,663 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.KeyboardInteractiveAuthentication - SSH: Sent SSH_MSG_USERAUTH_INFO_REQUEST (Password Authentication):
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - User login attempt has been made from address /172.16.8.1:58222
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking config agent [accountName=rene1 remoteAddress=/172.16.8.1]
2017-05-30 23:10:36,446 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Config agent success [accountName=rene1 remoteAddress=/172.16.8.1]
Я хотел бы извлечь весь кусок журнала из в 23:10:36
с 23:11:34
помощью sed
но это не удалось. Я проверил grep
и awk
но нет надежды на мой ожидаемый результат. Это только дает мне журнал, произошедший с 23:10:36
которым я не мой ожидаемый результат. Это моя команда
sed -n '/23:10:36/,/23:11:34/p' stlog.txt
Кто-нибудь знает, как это сделать? Он содержит только время без даты, потому что моя программа будет получать только текущее системное время и запрашивать базу журнала только по текущему системному времени.
решение1
Я вижу здесь две проблемы: 1) журнал, похоже, в обратном порядке, 2) у вас есть несколько строк, соответствующих шаблону «end».
(Хотя в последней строке указано 23:10:36,446, что позже, чем 23:10:36,415 в предпоследней строке)
При обратном порядке вы получите только совпадающие строки, 23:10:36
поскольку sed
начинает печать, когда видит это, и продолжает, пока не увидит 23:11:34
, которого там нет.
Поменять шаблоны местами (как показано ниже) может показаться решением, но вы все равно получите только первую строку, соответствующую конечному шаблону, поскольку печать останавливается, когда этот шаблон появляется в первый раз.
sed -n '/23:11:34/,/23:10:36/p' stlog.txt
Вот awk
решение, которое должно помочь обойти эту проблему:
awk -vstart="23:11:34" -vend="23:10:36" \
'$0 ~ start {p=1} $0 ~ end {e=1} e && $0 !~ end {p=0} p' stlog.txt
Переменная p
управляет печатью и очищается только после того, как будет виден шаблон «конец» ( e
равно 1).итекущая строка больше не соответствует этому шаблону.