Повідомлення Райана дає цікаву ідею, однак воно провалюється в кількох аспектах. Під час тестування tail -f /var/log/syslog | xargs -L 1 echo $(date +'[%Y-%m-%d %H:%M:%S]') $1
я помітив, що часова марка залишається такою ж, навіть якщо stdout
з’являється пізніше з різницею в секундах один від одного. Розглянемо цей вихід:
[2016-07-14 01:44:25] Jul 14 01:44:32 eagle dhclient[16091]: DHCPREQUEST of 192.168.0.78 on wlan7 to 255.255.255.255 port 67 (xid=0x411b8c21)
[2016-07-14 01:44:25] Jul 14 01:44:34 eagle avahi-daemon[740]: Joining mDNS multicast group on interface wlan7.IPv6 with address fe80::d253:49ff:fe3d:53fd.
[2016-07-14 01:44:25] Jul 14 01:44:34 eagle avahi-daemon[740]: New relevant interface wlan7.IPv6 for mDNS.
Моє запропоноване рішення є подібним, однак забезпечує належне відмітку часу і використовує дещо більш портативний printf
, ніжecho
| xargs -L 1 bash -c 'printf "[%s] %s\n" "$(date +%Y-%m-%d\ %H:%M:%S )" "$*" ' bash
Чому bash -c '...' bash
? Тому що через -c
опцію, перший аргумент присвоюється $0
і не відображатиметься у висновку. Зверніться до сторінки керівництва вашої оболонки для правильного опису-c
Тестування цього рішення tail -f /var/log/syslog
та (як ви, напевно, могли здогадатися), відключення та підключення до мого Wi-Fi, показало належну мітку часу, яку надають date
і syslog
повідомлення, і повідомлення
Баш може бути замінений будь-якою оболонкою, що нагадує бурш, може бути виконана з будь-якою ksh
або dash
, принаймні, з тими, що мають -c
можливість.
Потенційні питання:
Рішення вимагає наявності xargs
, яке доступне на POSIX-сумісних системах, тому більшість Unix-подібних систем слід охоплювати. Очевидно, не буде працювати, якщо ваша система не сумісна з POSIX або її немаєGNU findutils