Использование gsub()
в awk
для последнего;
-поля с разделителями:
$ awk -F ';' 'BEGIN { OFS=FS } { gsub(" ", ",", $NF); print }' file
some name;another thing; random;,value,value,value,value,value
Используя sed
и предполагая, что мы хотим заменить все пробелы после последнего ;
запятыми:
$ sed 'h;s/.*;//;y/ /,/;x;s/;[^;]*$//;G;s/\n/;/' file
some name;another thing; random;,value,value,value,value,value
Аннотированный sed
скрипт:
h ; # Duplicate line into hold space
s/.*;// ; # Delete up to the last ;
y/ /,/ ; # Change space to comma in remaining data
x ; # Swap pattern and hold spaces
s/;[^;]*$// ; # Delete from the last ;
G ; # Append hold space delimited by newline
s/\n/;/ ; # Replace the embedded newline with ;
; # (implicit print)
«Пространство хранения» представляет собой отдельный буфер хранения, который sed
предоставляет. «Пространство шаблонов» — это буфер, в который данные считываются из ввода и к которому могут быть применены модификации.
Я предлагаю вам, чтобы ваша Java-программа всегда работала в очень легкой среде виртуального рабочего стола, к которой можно получить доступ через VNC с самого Raspberry Pi (RPi )или с другого компьютера через сеть. Таким образом, не имеет значения, подключен ли монитор к RPi.
Мы собираемся использовать Xvfb и Fluxbox для предоставления нам виртуального рабочего стола и «x11vnc» для предоставления доступа к виртуальному рабочему столу. Из описания пакета Xvfb Debian:
Xvfb provides an X server that can run on machines with no display hardware and no physical input devices. It emulates a dumb framebuffer using virtual memory.
Установите необходимые пакеты
sudo apt install x11vnc xvfb fluxbox x11-apps
Я предполагаю, что для запуска Java-программы будет использоваться пользователь RPi по умолчанию (pi
).
Войдите в RPi через SSH или его физическую консоль (с настоящим монитором и клавиатурой ).
Создайте файл сценария /home/pi/radio_scanner.sh
со следующим содержимым:
#!/bin/bash
export DISPLAY=:1
Xvfb $DISPLAY -screen 0 1024x768x16 &
fluxbox &
x11vnc -display $DISPLAY -bg -forever -nopw -quiet -xkb
xclock & # just for testing, may remove this line
java -jar some_file.jar & # you program
Сделать скрипт исполняемым:
chmod +x /home/pi/radio_scanner.sh
Запустить скрипт как фоновый процесс, перенаправляя его вывод в файлы:
~pi/radio_scanner.sh > ~pi/log_radio_scanner.txt 2> ~pi/errors_radio_scanner.txt &
Если вы хотите защитить доступ к VNC паролем, сначала установите его:
x11vnc -storepasswd
Затем в сценарии замените строку, выполняющуюся x11vnc
, на
x11vnc -display $DISPLAY -bg -forever -usepw -quiet -xkb
Из консоли RPi или другого компьютера, доступного по сети, подключитесь к RPi с помощью клиента VNC, мойtigervnc-viewer
(Linux ).
vncviewer RPI_IP_ADDRESS
Теперь вы должны увидеть рабочий стол Fluxbox с запущенной программой Java и приложением xclock.
Чтобы программа Java всегда запускалась при загрузке RPi, попробуйте один из следующих двух вариантов.
Вероятно, лучший вариант для Ubuntu Mate.
Отредактируйте crontab для своего пользователя (pi )и запланируйте запуск программы во время загрузки. В оболочке выполните:
crontab -e
Появится текстовый редактор, добавьте следующую строку в конце
@reboot /home/pi/radio_scanner.sh
Вставьте следующую строку в файл /etc/rc.local
. Не забудьте оставить команду «exit 0
» последней строкой в этом файле!
su - pi --command=/home/pi/radio_scanner.sh > ~pi/log_radio_scanner.txt 2> ~pi/errors_radio_scanner.txt &
Вы можете использоватьxvfb-run
:
xvfb-run is a wrapper for the Xvfb(1x) command which simplifies the task of running commands (typically an X client, or a script containing a list of clients to be run) within a virtual X server environment.
Если ваша программа/скрипт /usr/local/bin/radio-scanner
, вы можете запустить ее напрямую с помощью:
xvfb-run /usr/local/bin/radio-scanner
Если вам когда-нибудь понадобится доступ к этому серверу, вы можете использовать x11vnc
и программу просмотра vnc. Это немного выходит за рамки вашего вопроса, но здесь речь идет о локальном просмотре с использованием x11vnc+xvncviewer
. Давайте использовать xclock
, например:
# run insided X server number 99, specify the auth file
xvfb-run -n 99 -f /tmp/xvfb-auth -- xclock -digital -update 1
Затем, когда вам нужно увидеть текущий экран:
# connect x11vnc to it
x11vnc -display :99 -N -auth /tmp/xvfb-auth
# connect a vnc client to display :99
xvncviewer :99
У меня была такая же ситуация, и я быстро решил ее, установив сервер x2go и клиент x2go.
https://wiki.x2go.org/doku.php
https://wiki.x2go.org/doku.php/wiki:repositories:raspbian
https://www.youtube.com/watch?v=Qzjg8MvdkmA&ab_channel=LawrenceSystems
Я пробовал другие решения, такие как vnc, но они были слишком медленными ^^'