![tee와 grep(쉘)을 동시에 사용하시나요?](https://linux55.com/image/17031/tee%EC%99%80%20grep(%EC%89%98)%EC%9D%84%20%EB%8F%99%EC%8B%9C%EC%97%90%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%8B%9C%EB%82%98%EC%9A%94%3F.png)
$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
, 및 에 따라 다름 ) .tron
userconfigdir
userdatadir
var
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 출력을 읽는 내용 이 아무것도 표시되지 않습니다 . tee
after end 까지 완전히 전달됐다고 하면 while
뭔가 새로운 걸 배운 셈이다.
C. 무한 루프에서 $tron 명령을 가능한 한 빨리 실행하고 싶습니까? 많은 시스템에서 이는 결국 최소 1개의 CPU 전체 용량을 소비하게 됩니다. 하나 추가할까요 sleep 1
?
달성하려는 작업에 대한 더 많은 배경 정보를 추가하면 도움이 될 것입니다! 행운을 빌어요.