linux 'script'명령 http://www.linuxcommand.org/man_pages/script1.html 을 사용하여 일부 대화식 세션을 추적하고 있습니다. 이의 출력 파일에는 백 스페이스 키 입력을 포함하여 인쇄 할 수없는 문자가 포함되어 있습니다.
이러한 출력 파일을 정리하여 화면에 표시된 것만 포함 할 수있는 방법이 있습니까?
아니면 대화식 쉘 세션 (입력 및 출력)을 기록하는 다른 방법이 있습니까?
linux 'script'명령 http://www.linuxcommand.org/man_pages/script1.html 을 사용하여 일부 대화식 세션을 추적하고 있습니다. 이의 출력 파일에는 백 스페이스 키 입력을 포함하여 인쇄 할 수없는 문자가 포함되어 있습니다.
이러한 출력 파일을 정리하여 화면에 표시된 것만 포함 할 수있는 방법이 있습니까?
아니면 대화식 쉘 세션 (입력 및 출력)을 기록하는 다른 방법이 있습니까?
답변:
파일을 보려면 출력을 통해 col -bp
; 제어 문자를 해석합니다. 원하는 경우 더 적은 양으로 파이프를 연결할 수 있습니다.
col -bp typescript | less -R
일부 시스템 col
에서는 파일 이름 인수를 허용하지 않으므로 대신이 구문을 사용하십시오.
col -bp <typescript | less -R
col
파일 이름을 허용하지 않으므로 col -bp < typescript
원하는 것을 수행했습니다.
less -R
자체는 col -bp
처음 부터 파이프보다 더 나은 출력을 제공합니다 .
col -bp <typescript | less -R
하면 색상 콘솔이 표시되지 않습니다. 를 사용 less -R typescript
하면 컬러 콘솔이 표시됩니다!
less
.
cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed
다음은 문자열 입력에 대한 해석입니다 perl
.
s/pattern//g
전체를 대체하는 것을 의미합니다 ( g
옵션은 첫 번째 대체를 멈추지 않고 전체를 수행함을 의미합니다) 입력 문자열정규식 패턴에 대한 해석은 다음과 같습니다.
\e
특수한 "탈출"제어 문자 (ASCII 0x1A)와 일치(
그리고 )
그룹의 시작과 끝|
그룹이 N 패턴 중 하나와 일치 할 수 있음을 의미합니다. N 패턴이있는 곳
[^\[\]]
또는\[.*?[a-zA-Z]
또는 \].*?\a
[^\[\]]
방법
[
하고]
\[.*?[a-zA-Z]
방법
[
다음 .*?
첫 번째 알파 문자까지 욕심이 없습니다.\].*?\a
방법
]
욕심이없는 문자열을 찾습니다..*?
typescript
하는 perl
프로그램에 출력을 에코 한 다음 출력을 unix col
명령으로 파이프합니다.이 명령 -b
은 스크립트에서 "삭제"키 아티팩트를 제거합니다. 그런 다음 출력을 텍스트 파일로 파이프합니다.
많은 양의 script
출력을 얻으 려면 perl 스크립트를 반복적으로 해킹합니다. 그렇지 않으면 좋은 편집기로 직접 편집하십시오.
script
특정 중요한 순간 (예 : 호스트가 사용자 입력의 첫 번째 문자를 기다리는 경우)에 화면에 표시된 내용을 재현하는 방식으로 출력에서 제어 문자를 제거하는 기존의 자동화 된 방법은 없을 것입니다 .
예를 들어 화면을 비워 두었다가 백 스페이스를 12 번 (필요한 것보다 많이) Andrew $
입력 rm /*
하고 누른 경우 화면 끝에 표시되는 내용은 실행중인 쉘, 현재 stty
설정 에 따라 다릅니다 ( 세션 도중에 변경 될 수 있음) 및 다른 요인도있을 수 있습니다.
위의 내용은 입력 및 출력을 지속적으로 캡처하는 자동화 된 방법에 적용됩니다. 주요 대안은 "스크린 샷"을 찍거나 세션 중에 적절한 시간에 화면을 잘라내어 붙여 넣는 것입니다 (이것은 사용자 안내서, 요일 로그 메모 등).
내 질문의 두 번째 부분에 대한 대답은 ^A H
실행중인 화면 세션 내 에서 gnu screen의 로깅 기능을 사용하는 것 입니다. 설명서는 http://www.gnu.org/software/screen/manual/screen.html#Logging 에 있습니다 .
cat filename
제어 문자를 제거하는 데 사용했습니다 :-)
col -bp는 백 스페이스를 원하는대로 처리합니다 (AFAIK). 그러나 색상 이스케이프 시퀀스를 엉망으로 만듭니다. 색상 순서를 먼저 제거한 다음 가능하면 백 스페이스를 처리하는 것이 좋습니다.
이것은 매우 일반적인 요구이며 이에 대한 해결책이 더 이상 없다는 사실에 놀랐습니다. 세션을 스크립팅하는 것이 매우 일반적이며, 누군가는 절차를 검토해야합니다. 작은 타이핑 실수와 색상 이스케이프 시퀀스를 모두 제거하여 나중에 참조 할 수 있도록 "깨끗한"절차 스크립트를 작성하려고합니다. 간단한 ASCII 텍스트가 선호됩니다. 나는 이것이 "사람이 읽을 수있는"것이 의도 한 것이라고 생각하며, 그것은 매우 합리적인 일입니다.
나는 당신이 Perl을 사용할 수있는 환경에 있다면 dewtall 이 유닉스 보드에서 비슷한 질문에 대한 답변이 스크립트 출력에서 제어 문자를 제거하는 데 더 효과적 이라는 것을 알았습니다 .
dewtall의 스크립트 :
#!/usr/bin/perl
while (<>) {
s/ \e[ #%()*+\-.\/]. |
\r | # Remove extra carriage returns also
(?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
(?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
(?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
\e.|[\x80-\x9f] //xg;
1 while s/[^\b][\b]//g; # remove all non-backspace followed by backspace
print;
}
제어 문자를 제거하려면 다음을 수행하십시오.
./dewtalls-script.pl < output-from-script-that-needs-control-characters-removed
이 문제를 해결하기 위해 https://github.com/RadixSeven/typescript2txt 가 작성되었습니다.
마지막으로 업데이트 / 사용한 지 4 년이 지났지 만 지금도 여전히 작동하지 않아야하는 멋진 일을 기억하지 못합니다.
나는 그것을 할 수있는 좋은 방법을 찾았습니다. 내 시스템에서 긴 출력 라인에 "^ M"(빈 공간 다음에 캐리지 리턴)이 뿌려집니다. "^ M"은 널 문자 "^ @"로 대체 할 수 있으며 파일을 표시 할 때 전혀 표시되지 않습니다.
타이밍도 캡처하므로 파일을 완벽하게 재생하려면 아래 명령을 사용하여 "^ M"을 완전히 제거 할 수 없습니다 (scriptreplay가 바이트 수를 계산하기 때문에).
tr '\r' '\0' | sed 's/ \x0//g'
다음과 같이 스크립트 명령을 실행합니다.
script -t -f session.log 2>timing
그래서 나중에 내가하는 일은 :
cat session.log | tr '\r' '\0' > typescript
scriptreplay -t timing | sed 's/ \x0//g'
첫 번째 편집 (재생 전)은 파일의 바이트 수를 유지합니다. 두 번째 편집 (재생 후)은 임의의 위치에서 공백을 제거합니다. (기본적으로 scriptreplay는 "typescript"라는 이름의 입력 파일을 검색하므로 "타이밍"후에는 입력하지 않았습니다.
다른 해결책은 strings
파일 (또는 표준 입력)에서 인쇄 가능한 문자 만 인쇄하는 것입니다.
strings -n 1 filename
이 -n 1
옵션을 사용하면 시퀀스의 최소 길이가 1로 유지되므로 인쇄 할 수없는 문자로 둘러싸인 단일 인쇄 가능 문자도 유지됩니다.
이 접근법의 한 가지 단점은 strings
은 인쇄 가능한 문자의 연속 문자열 사이에 줄 바꿈 추가 입니다. 예를 들어 내용이있는 파일
Foo<SOMECONTROLCHAR>Bar
(어디에 <SOMECONTROLCHAR>
제어 문자 또는 인쇄 할 수없는 다른 문자가 )는 다음과 같이 반환됩니다.
Foo
Bar
주석에서 제기 된 또 다른 문제는 일부 제어 문자 시퀀스가 인쇄 가능 문자와 인쇄 불가능 문자의 조합으로 구성되어 있으며이 방법은 해당 문자의 일부만 제거한다는 것입니다.
그러나 strings
질문에 언급 된 백 스페이스와 같은 제어 문자를 제거하는 것이 좋습니다.
strings
인쇄 할 수없는 문자를 모두 제거하지는 않습니다. 일련의 인쇄 가능한 문자를 식별하고 인쇄 합니다 . 그것은 같은 것이 아닙니다.
strings
으로 최소 길이 4의 시퀀스 만 인쇄 -n 1
합니다. 최소 길이를 1로 설정하는 옵션을 추가하여 답을 수정 했습니다.이 점을 지적 해 주셔서 감사합니다.
strings
인쇄 할 수없는 모든 문자 를 제거 한다는 동일한 주장을 하므로 편집 전과 같은 방식으로 여전히 잘못되었습니다. "일부 색상 코드"(및 일반적으로 제어 코드)는 종종 인쇄 가능한 문자와 인쇄 할 수없는 문자로 구성되기 때문에 분명히 손상되었습니다. 예를 들어, 제어 코드 시퀀스가 될 수있는 텍스트 색상 변경 ESC[01;52m
여기서 ESC
단일 제어 문자 (바이트 값 27)이다. strings
제안한대로 사용 [01;52m
하면 출력에 남을 수 있습니다 .
strings
다른 답변 중 일부와 동일한 작업을 수행하지 않을 수도 있지만 IMHO는 질문에 설명 된 문제를 해결하는 올바른 방법입니다.