캡처해야 하는 두 가지 이벤트가 포함된 로그 파일이 있습니다.
각 이벤트는 로그 파일에 다음 형식으로 별도의 전용 줄을 생성합니다.
타임스탬프 - PID - 프로세스 - 이벤트 유형 - 이벤트 세부정보
그 외에는 아무것도 신경 안 써이벤트 세부정보내가 수신할 것으로 예상되는 파일의 열과 데이터는 다음과 같습니다.
예시 1: { "values":{ "SPEED":"7.0" } }
예 2: { "values":{ "CADENCE":"41" } }
나는 로그 파일의 내용에 따라 매번 로그 파일의 마지막 줄만 읽는 쉘 스크립트를 작성하려고 했습니다.이벤트 세부정보열, 결과 리디렉션속도또는율특정 텍스트 파일에 대한 데이터(결과를 말할 때)속도/케이던스데이터는 "정수"를 의미합니다.속도":"예를 들어 표현).
지금까지는 결과를 두 개의 다른 파일로 리디렉션할 수 있지만 다음과 같습니다.
- 스크립트가 작동하도록 하려면 로그 파일을 두 번 "꼬리게" 해야 했고...
- ...그래서 두 번째 파일이 첫 번째 파일과 같은 속도로 업데이트되지 않는 것 같은 느낌이 듭니다... 어떤 이유로 일부 파일이 누락된 것 같습니다.율이벤트는 스크립팅 순서에 따라 달라집니다.
나는 사용하려고잠기능을 수행했으며 한 번에 여러 행을 "후행"하여 CADENCE 업데이트 부족을 완화하려고 시도했지만 성공하지 못했습니다. 저는 가끔 CADENCE 이벤트가 그리워요.
로그 파일 동작에 대한 참고 사항:로그를 보면 3개의 이벤트가 가장 많이 나타나며, 항상 동일한 발생 순서(CADENCE, SPEED, OTHER)로 기록되며, 간헐적으로 4번째 이벤트가 나타납니다. 저는 단지 누락된 CADENCE 이벤트가 "네 번째" 이벤트의 출현과 아무 관련이 없다는 점을 분명히 하고 싶었습니다.
현재 실행 중인 스크립트의 요약 버전은 다음과 같습니다.
#!/bin/bash
while :
do
tail -1 logfile.txt | grep -oP '(?<=SPEED":")[0-9]+' > spd.txt
tail -1 logfile.txt | grep -oP '(?<=CADENCE":")[0-9]+' > cad.txt
done
======업데이트:========
전체 로그 줄과 예상 출력은 다음과 같습니다.
1행의 예:
입력(logfile.txt에서):
03-16 21:05:28.641 2797-2842/process:Service D/WEBSOCKET: 수신: { "values":{ "Speed MPH":"3.1", "Speed KPH":"4.9", " 마일":" 0.551", "km":"0.886" } }
출력(spd.txt로 전송됨):
4.9
예시 라인 2:
입력(logfile.txt에서):
03-16 21:05:29.309 2797-2842/process:Service D/WEBSOCKET: 수신: { "values":{ "RPM":"27" } }
출력: (cad.txt로 전송됨):
27
답변1
여기서는 while 루프가 필요하지 않습니다.
tail -f logfile.txt | awk '/SPEED/{print >"spd.txt"}/CADENCE/{print >"cad.txt"}'
답변2
알겠습니다, Kamaraj님, 도움을 주셔서 감사합니다! 올바른 답을 찾는 열쇠는 다음과 같습니다.
이것은 나에게 맞는 스크립트입니다.
Tail-1 로그 파일.txt | awk -F"\":\"" '{for (c=1;c<=NF;c++) {if ($c ~ /Speed KPH/) {print $( c+ 1)+0 > "spd.txt"} {if ($c ~ /RPM/) {print $(c+1)+0 > "cad.txt"}}}}'
돌아가야 해꼬리-1왜냐하면꼬리 -f버퍼링의 영향을 받아 캡처된 모든 값이 포함된 txt 파일에 기록도 남깁니다. 최신 결과가 포함된 출력 텍스트 파일에서 한 줄만 예상됩니다.
감사합니다.