Как выводить команду netstat каждые 2 секунды в текстовый файл?

Как выводить команду netstat каждые 2 секунды в текстовый файл?

Я пытаюсь сделать следующее, но мне трудно заставить это работать так, как ожидалось. Попробовал использовать команду 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 секунды". В цикле у вас есть два варианта:

  1. Вы запускаете конвейер асинхронно, sleepна 2 секунды, и запускаете новый; и так далее. Таким образом, это почти идеально "каждые 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

В Вашем случае есть еще две проблемы:

  1. Вам нужен заголовок. Сначала поместите его в файл, а затем добавьте ( >>) к файлу.

  2. Вы хотите, чтобы дата была в той же строке, что и то, что следует за ней. Вывод из 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

Связанный контент