Я пытаюсь сделать следующее, но мне трудно заставить это работать так, как ожидалось. Попробовал использовать команду watch, но вывод просто беспорядок. Я нашел следующее, но не смог заставить это работать для моих нужд:
watch 2 "netstat -a | grep 20427 | grep ESTABLISHED | wc -l"
Я хотел бы выполнить следующую команду и вывести данные в файл со следующими двумя столбцами каждые две секунды.
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 секунды". В цикле у вас есть два варианта:
Вы запускаете конвейер асинхронно,
sleep
на 2 секунды, и запускаете новый; и так далее. Таким образом, это почти идеально "каждые 2 секунды". Но если выполнение одной итерации занимает больше времени, чем интервал, вывод из нее может появиться после вывода из следующей или даже перемежаться с ним.Вы запускаете конвейер синхронно,
sleep
на 2 секунды, и запускаете новый; и так далее. Таким образом, это не «каждые 2 секунды», а скорее «2 секунды между ними». Но поскольку в любой момент времени работает максимум один конвейер, нет риска, что общий вывод будет искажен.
Примечание watch -n 2 'sleep 10; date'
запускается date
примерно каждые 10 секунд. 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