다음을 수행하려고 노력하고 있지만 예상대로 작동하는 데 어려움을 겪고 있습니다. watch 명령을 사용해 보았으나 출력이 엉망이었습니다. 다음을 찾았지만 내 요구에 맞게 작동시키지 못했습니다.
watch 2 "netstat -a | grep 20427 | grep ESTABLISHED | wc -l"
다음 명령을 실행하고 2초마다 다음 두 열이 있는 파일에 출력하고 싶습니다.
netstat -a | grep 20427 | grep ESTABLISHED | wc- l
DATE_TIME | NUMBER_OF_CONNECTIONS
Fri Nov 6 14:57:37 | 5
Fri Nov 6 14:57:39 | 10
Fri Nov 6 14:57:41 | 5
Fri Nov 6 14:57:43 | 2
귀하가 제공할 수 있는 도움에 감사드립니다. 조심하고 안전하세요.
답변1
watch
는... 음, 보고 싶을 때 좋은 도구입니다. 터미널과 상호 작용합니다. 출력을 파일로 리디렉션하면 결국 파일에 기록된 터미널 제어 시퀀스를 찾을 수 있습니다. 이것이 당신이 시도한 것이라면 그러한 시퀀스는 아마도 당신이 언급한 엉망일 것입니다.
루프에서 명령을 실행하는 간단한 방법은… 음, 루프를 사용하는 것입니다. :)
netstat | …
"2초마다" 실행하고 싶다고 하셨습니다 . 루프에는 두 가지 옵션이 있습니다.
파이프라인을 2초 동안 비동기식으로 실행
sleep
하고 새 파이프라인을 실행합니다. 등등. 이렇게 하면 거의 완벽하게 "2초마다"가 됩니다. 그러나 단일 반복을 실행하는 데 간격보다 더 많은 시간이 걸리는 경우 해당 반복의 출력은 다음 반복의 출력 뒤에 나타나거나 인터리브될 수도 있습니다.파이프라인을 2초 동안 동기식으로 실행
sleep
하고 새 파이프라인을 실행합니다. 등등. 이렇게 하면 "2초마다"가 아니라 "2초 간격"이 됩니다. 그러나 특정 순간에 최대 하나의 파이프라인이 실행되므로 전체 출력이 엉망이 될 위험이 없습니다.
메모는 약 10초마다 watch -n 2 'sleep 10; date'
실행됩니다 . date
자체적 watch
으로는 "2초마다"가 아닌 "2초 간격" 방식을 사용합니다.
whatever
2초 간격으로 실행되고 출력을 파일로 리디렉션하는 루프는 다음과 같습니다.
while :; do whatever; sleep 2; done >output_file
귀하의 경우에는 두 가지 추가 문제가 있습니다.
헤더를 원합니다. 먼저 파일에 배치한 다음
>>
파일에 ( )를 추가합니다.날짜가 다음과 같은 줄에 있기를 원합니다. 사용자 정의 형식을 사용하더라도 출력은
date
개행 문자로 끝납니다. 으로 제거할 수 있습니다tr
. 또는 출력을 변수로 캡처하고($()
후행 줄 바꿈을 모두 제거함) 나중에 인쇄합니다.
이와 같이:
echo 'DATE_TIME | NUMBER_OF_CONNECTIONS' >output_file
while :; do
date="$(date)"
printf '%s | ' "$date"
netstat -a | grep 20427 | grep ESTABLISHED | wc -l
sleep 2
done >>output_file