저는 처리를 위해 한 서버에서 다른 서버로 데이터를 파이프하는 프로세스를 연구하고 있습니다.
정확한 명령은 아니지만 다음과 같이 보일 수 있습니다.
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
명령 그룹의 출력을 리디렉션합니다 .grep
awk
socat
netcat
또는 행을 읽고 일치하는 경우 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 구현에는 각 출력 줄 이후에 강제로 플러시하는 옵션이 있습니다.awk
gawk
fflush()
print
-Winteractive
mawk
awk
system("")
grep
--line-buffered
tail -f logfile
의 약자 라는 점도 참고하세요 tail -n 10 -f logfile
. 실제로 tail -n +1 -f logfile
전체 로그 파일을 처리한 다음 파일 처리를 tail
계속하거나 추가하는 행만 처리하기를 원할 수도 있습니다.f
tail -n 0 -f logfile
지금부터.