쉘 스크립트를 통해 파이프에 헤더 라인을 삽입하는 방법은 무엇입니까?

쉘 스크립트를 통해 파이프에 헤더 라인을 삽입하는 방법은 무엇입니까?

저는 처리를 위해 한 서버에서 다른 서버로 데이터를 파이프하는 프로세스를 연구하고 있습니다.

정확한 명령은 아니지만 다음과 같이 보일 수 있습니다.

tail -f logfile | grep "abc" | grep "def" | grep -v "ghi" | netcat -q 0 n.n.n.n 7777

이 모든 grep을 스크립트로 래핑하고 더 중요한 것은 파이프 앞에 식별자를 추가하고 싶기 netcat때문에 명령은 다음과 같습니다.

tail -f logfile | myscript.sh {id}

상대방의 수신 대기 스크립트는 다음을 수신해야 합니다.

{id}
[Line 1 of the logfile]
[Line 2 of the logfile]
...

스크립트로 래핑하는 것은 쉽습니다.

#!/bin/sh
id=$1
grep "abc" | grep "def" | grep -v "ghi" | netcat -q 0 n.n.n.n 7777

$id그런데 처음에는 어떻게 주사해야 할지 모르겠어요 .

수신측에서는 다음을 사용하고 있습니다.

 socat -u tcp-l:7777,fork system:/dev/receivePipe

따라서 다른 방법(예: 매개변수 /dev/receivePipe)이나 환경 변수를 통해 ID를 얻을 수 있다면 그것도 작동할 것입니다.

편집: 최종 답변은 허용된 답변에 대한 의견에서 나왔습니다.

#!/bin/sh
{
  printf '%s\n' $1
  grep "abc" | grep "def" | grep -v "ghi" 
} | netcat -q 0 192.168.56.105 7777

답변1

그냥 해:

#! /bin/sh -
{
  printf '%s\n' "${1-default-id}"
  awk '/abc/ && /def/ && ! /ghi/'
} | socat - tcp:n.n.n.n:7777

${1-default-id}지정되거나 그렇지 않으면 첫 번째 위치 인수로 확장됩니다 default-id. 인수가 전달되지 않은 경우(또는 기본값 대신 오류 메시지를 지정하는 경우) ${1?}오류로 종료하는 것으로 대체됩니다 .${1?The error message}

ID를 출력하고 명령을 /로 필터링하기 위해 실행하는 printf명령 그룹의 출력을 리디렉션합니다 .grepawksocatnetcat

또는 행을 읽고 일치하는 경우 ID를 인쇄하십시오.

#! /bin/sh -
ID=${1-default-id} awk '
  /abc/ && /def/ && ! /ghi/ {
    if (!already_printed++) print ENVIRON["ID"]
    print
  }' | socat - tcp:n.n.n.n:7777

또는 각 줄 앞에 ID(및 공백 문자)를 추가하세요.

#! /bin/sh -
ID=${1-default-id} awk '
  /abc/ && /def/ && ! /ghi/ {
    print ENVIRON["ID"], $0
  }' | socat - tcp:n.n.n.n:7777

입력이 파이프(tty 장치 이외의 모든 장치)에 제공되면 awk출력을 버퍼링하는 것과 같습니다. GNU 구현(일명 )을 사용하면 grep각각 뒤에 호출을 추가하여 해당 버퍼를 강제로 플러시할 수 있습니다. 또한보십시오. 대부분의 구현에서 실행하면 강제로 새로 고쳐집니다. GNU 구현에는 각 출력 줄 이후에 강제로 플러시하는 옵션이 있습니다.awkgawkfflush()print-Winteractivemawkawksystem("")grep--line-buffered

tail -f logfile의 약자 라는 점도 참고하세요 tail -n 10 -f logfile. 실제로 tail -n +1 -f logfile전체 로그 파일을 처리한 다음 파일 처리를 tail계속하거나 추가하는 행만 처리하기를 원할 수도 있습니다.ftail -n 0 -f logfile지금부터.

관련 정보