티 출력에 문자열 삽입

티 출력에 문자열 삽입

bash를 통해 일부 기능을 구현하기 위해 Centos 6에서 파이프를 사용하고 있습니다. 이러한 파이프라인에서는 데이터를 로그 파일로 내보내고 싶지만 이 데이터는 파이프라인의 다른 파이프에서 제공되므로 각 로그 줄 앞에 태그를 삽입하여 구분하려고 합니다. 보다 정확하게는 다음을 수행하고 싶습니다.

COMMAND1 | (create a line in the log file like: "command1: " + output of the command) | COMMAND2 ...

많은 연구 끝에 나는 다음과 같은 관점에 도달했습니다.

COMMAND1 | tee >(ifne echo -n "command1: " >> out.log) | tee -a out.log | COMMAND2

이것은 작동하지만 문제가 있습니다. 두 번째 파일이 tee먼저 파일에 쓴 다음 첫 번째 파일에 씁니다 tee. 그래서 나는 다음을 얻습니다:

(output of command 1)
command1: 

바꾸다

command1: (output of command 1)

ifne나는 두 번째가 tee첫 번째보다 먼저 실행되기에는 지연이 충분하다고 생각합니다 . 제거하면 ifne잘 작동됩니다. 문제는 ifne종종 유휴 출력이 있고 이를 기록하고 싶지 않기 때문에 그렇게 해야 한다는 것입니다.

두 번째 티가 첫 번째 티가 끝날 때까지 기다리게 하는 방법은 무엇입니까?

답변1

내가 올바르게 이해했다면 COMMAND1에서 왔다는 것을 나타내는 태그를 사용하여 COMMAND1의 출력을 기록하려고 합니다. 한 가지 방법은 다음과 같습니다.

COMMAND1 | tee >(sed 's/^/command1: /' >>out.log) | COMMAND2

알아채다:

  • 이렇게 하면 command1:첫 번째 줄뿐만 아니라 각 줄의 시작 부분에 태그가 추가됩니다. 이는 바람직하다고 생각하지만 원하는 작업은 아닙니다.
  • command1sed 특수 문자를 포함하면 안 됩니다. 그렇지 않으면 백슬래시로 보호해야 합니다.
  • 추가용으로 열려 있으므로 out.log동일한 로그 파일에 여러 명령을 병렬로 출력하더라도 출력이 중복될 위험이 없습니다.
  • out.log이 조각에서는 한 번만 열리므로 모든 행이 순서대로 표시됩니다 .
  • 나쁜 소식은 동일한 파일에 여러 번 병렬로 로그인하는 경우 해당 줄이 원하는 순서로 나타날 것이라는 보장이 없다는 것입니다. 예를 들어,

    echo hello | tee >(sed 's/^/command1: /' >>out.log) | tr a-z A-Z | tee >(sed 's/^/command2: /' >>out.log)
    

    command2: HELLO이전에 로그인되었을 수 있습니다 command1: HELLO.

  • 동일한 파일에 여러 번 병렬로 로그인하고 줄이 너무 길면 다른 인스턴스의 줄이 분산될 수 있습니다. 일반적인 sed 구현은 다음보다 덜 통과할 것이라고 생각합니다.PIPE_BUF바이트 길이이지만 확실하지 않습니다.

순서 및 원자성 제한이 있으므로 별도의 파일에 기록하는 것이 좋습니다. 이 경우 접두사가 필요하지 않습니다.

관련 정보