로그 파일 을 생성하는 프로세스에서 텍스트 기반 진행률 표시줄을 업데이트하기 ^H
때문에 많은 문자가 포함된 로그 파일이 있습니다 .^M
사용하면 cat
출력이 평가되어 사람이 읽을 수 있고 간결하게 표시됩니다. 아래는 샘플 출력입니다.
Epoch 11/120
4355/4355 [==============================] - ETA: 0s - loss: 0.0096
Epoch 00011: val_loss did not improve from 0.00992
4355/4355 [==============================] - 1220s 280ms/step - loss: 0.0096 - val_loss: 0.0100
cat
그러나 위의 실제 인쇄된 텍스트에 비해 파일 자체의 크기가 큽니다(약 900줄, 70MB).
다음은 로그 파일에 포함된 실제 텍스트의 일부입니다.
1/Unknown - 0s 81us/step - loss: 0.5337^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M 2/Unknown - 1s 438ms/step - loss: 0.5299^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^
H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M 3/Unknown - 1s 386ms/step - loss: 0.5286^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M 4/Unknown - 1s 357ms/step - loss: 0.5289^H^H^H^H^H^H^H^H^H^
H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M 5/Unknown - 2s 339ms/step - loss: 0.5277^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M 6/Unknown - 2s 327ms/
step - loss: 0.5258^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M 7/Unknown - 2s 318ms/step - loss: 0.5250^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^
H^H^H^H^H^M 8/Unknown - 2s 312ms/step - loss: 0.5260^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M 9/Unknown - 3s 307ms/step - loss: 0.5265^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^
H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M 10/Unknown - 3s 303ms/step - loss: 0.5257^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^H^M 11/Unknown - 3s 299ms/step - loss: 0.5258^H^H^H^
cat
기본적으로 생성된 파일과 동일하게 보이는 파일을 만들고 싶습니다 .
제가 시도했지만 거의 성공하지 못한 몇 가지 방법은 다음과 같습니다.
tr -d '\b\r' < logfile > new_file
모든 문자를 제거하지만 원하지 않는 텍스트는 모두 남겨둡니다.cat logfile > new_file
실제로 특수 문자를 평가하지 않고 파일을 그대로 복사하면 됩니다.cat logfile | col -b > new_file
거의 비슷하지만 반복되는 줄 중 하나에서 이상한 일이 발생합니다.
4355/4355 [==============================] - ETA: 0ss--loss::0.0096557
Epoch 00011: val_loss did not improve from 0.00992
4355/4355 [==============================] - 1220s 280ms/step - loss: 0.0096 - val_loss: 0.0100
어떤 도움이라도 대단히 감사하겠습니다.
감사해요
답변1
명확성을 위해 이것을 답변으로 게시하십시오.
~처럼로잉이 경우 명령은 awk -F '\r' '{print $NF}' file
예상대로 작동하여 마지막 캐리지 리턴 이후의 모든 항목을 제거한다는 점을 지적하십시오. 비록 이것이 견고하지는 않지만제브젝지적했다.
아래에 C++로 보다 강력한 솔루션을 작성했습니다.
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
string filter_string(string line, const char *bspace, const char *creturn){
string new_str;
for(string::size_type i = 0; i < line.size(); ++i) {
// Step back if current string not empty
if (line[i] == *bspace){
if (new_str.size() != 0){
new_str.pop_back();
};
// Reset on carriage return
} else if (line[i] == *creturn){
new_str = "";
} else {
new_str += line[i];
};
}
return new_str;
};
int main(int argc, char* argv[]){
const char backspace = '\x08';
const char creturn = '\r';
if (argc != 2){
cerr << "USAGE: " << argv[0] << " [src]" << endl;
return 1;
}
// Filter lines in file
string line;
ifstream infile(argv[1]);
while (getline(infile, line)){
cout << filter_string(line, &backspace, &creturn) << endl;
};
return 0;
};
이는 각 줄의 각 문자를 반복하며, ^H
a가 있으면 문자열이 1비트 뒤로 밀리고(아직 비어 있지 않은 경우) ^M
캐리지 리턴이 있으면 문자열이 재설정됩니다. 출력은 으로 전송된 stdout
후 파일로 파이프될 수 있습니다.
답변2
sed 's/.*\x0d//' logfile
요청한 대로 수행되는 것 같습니다.
col -b
공백을 무시하기 때문에 실패합니다 .
$ echo $'--------\r1st try\r2nd \r3rd\n' | col -b
3rd-try-