tee와 grep(쉘)을 동시에 사용하시나요?

tee와 grep(쉘)을 동시에 사용하시나요?

$log(txt 파일)에 쓴 다음 로그 파일에서 "[1]"로 시작하는 모든 텍스트를 찾아 다른 파일에 저장하는 서버를 실행하려고 합니다. 이것이 나의 시도이다. tee -a $log다른 모든 것과 함께 작동합니다. grep 명령은 그렇지 않습니다.

run="tail -n0 -f -s 0.01 $cmds | (while true; do $tron --userconfigdir $userconfigdir --userdatadir $userdatadir --vardir $var; done) | tee -a $log | grep '^[1]' > ${var}logs/chatlogs.log"

tee -a $log"[1]"부터 시작하는 모든 텍스트를 다른 파일로 복사하려면 어떻게 해야 합니까 ?

답변1

명령을 문자열에 넣지 마십시오. 복합 명령을 정의하는 방법은 함수입니다.

그런 다음 쉘 프로그래밍의 가장 중요한 규칙을 기억하십시오. 즉, 변수 대체에는 항상 큰따옴표를 넣으십시오(예: ) "$foo".

다음 코드 가 있습니다(변수 cmds, log, 및 에 따라 다름 ) .tronuserconfigdiruserdatadirvar

run () {
  tail -n0 -f -s 0.01 "$cmds" |
  while true; do
    "$tron" --userconfigdir "$userconfigdir" --userdatadir "$userdatadir" --vardir "$var"
  done |
  tee -a "$log" |
  grep '^[1]' > "${var}logs/chatlogs.log"
}

이제 코드가 읽을 수 있는 형식이므로 $tron무한 루프에서 실행되고 있음을 알 수 있습니다. 정확히 무엇을 하려는지 모르겠지만 해당 루프에 종료 조건을 추가해야 합니다.

답변2

[...]문자 목록의 연산자입니다. 당신은 그것을하고 싶을 수도 있습니다 grep '^\[1\]'.

답변3

대괄호를 피하면 충분하다고 생각합니다.grep '^\[1\]'

답변4

먼저, 쉘 디버깅 옵션을 사용하여 set -vx변수가 평가되는 방법/시기 등을 확인하십시오.

죄송한데 코드가 왜 이렇게 설정되어 있나요?

 run="..."? 

나중에 그 변수를 사용하고 싶기 때문인가요 $run?

그렇다면 거의 확실하게 이 작업을 수행해야 합니다.

eval "$run"

이는 특수 문자 이스케이프 측면에서 완전히 새로운 웜 캔을 열어줍니다. 다른 댓글 작성자가 지적했듯이 원하는 문자를 이스케이프 처리해야 할 뿐만 아니라 해당 문자를 두 번 이스케이프 처리해야 합니다. 과거에 이와 같은 작업을 수행했을 때 \\\\\작업을 수행하기 위해 아마도 (5!)와 같은 이스케이프를 사용하게 되었을 것입니다.

이 코드의 컨텍스트에 대한 추가 설명 없이 이 코드를 무시 run=하고 있는 그대로 실행하는 것이 좋습니다 tail -n0 -f -s 0.01 $cmds |.....

또한 Giles의 의견을 따라 확대해 보면 전체 파이프라인이 별로 의미가 없습니다.

 tail -n0 -f -s 0.01 $cmds | (while true; do $tron ....

A. 우리는 그 안에 무엇이 들어 있는지 모릅니다$cmds

(while true; ...)B. 서브셸에서는 tail cmd 출력을 읽는 내용 이 아무것도 표시되지 않습니다 . teeafter end 까지 완전히 전달됐다고 하면 while뭔가 새로운 걸 배운 셈이다.

C. 무한 루프에서 $tron 명령을 가능한 한 빨리 실행하고 싶습니까? 많은 시스템에서 이는 결국 최소 1개의 CPU 전체 용량을 소비하게 됩니다. 하나 추가할까요 sleep 1?

달성하려는 작업에 대한 더 많은 배경 정보를 추가하면 도움이 될 것입니다! 행운을 빌어요.

관련 정보