awk имя хоста и IP-адрес из файлов журнала, если номера столбцов отличаются

Вопрос прекрасно решен с помощью Music Player Daemon/Советы и хитрости -PulseAudio . И MPD с пульсаудио также полезен.

Сайта на самом деле достаточно, но позвольте мне написать, что я сделал. Во-первых, я установил для поля deviceв /etc/mpd.confзначение "alsa", но это неправильно. Динамик Bluetooth по умолчанию управляется не alsa, а pulseaudio(, по крайней мере, в Linux Mint, и хотя вы можете использовать динамик Bluetooth через alsa, используя, например,.BlueALSA). Таким образом, значение поля должно быть "pulse". Однако по умолчанию pulseaudioвыполняется в пользовательском пространстве, а mpd— в системе -. Таким образом, mpdне может получить доступ к настройкам сеанса pulseaudioтекущего пользователя. Чтобы mpdувидел настройку,вы можете включить удаленную функциональность pulseaudio:

sudo cp /etc/pulse/default.pa /etc/pulse/default.pa.bak
sudo vi /etc/pulse/default.pa

и измените строку

#load-module module-native-protocol-tcp

к этому (раскомментируйте и добавьте несколько слов)

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1

и перезапустите pulseaudio, чтобы отразить это изменение.

#Note there is no `sudo` prefix.
#As written above, `pulseaudio` runs in a user session.
pulseaudio --kill
pulseaudio --start

Теперь вы можете получить доступ к pulseaudio, используя протокол tcpи через IP-адрес 127.0.0.1(, обычно этоlocalhost). Наконец, следует изменить настройку mpd:

sudo cp /etc/mpd.conf /etc/mpd.conf.bak
sudo vi /etc/mpd.conf

и установите значение поля audio_output, как показано ниже

audio_output {
    type        "pulse"
    name        "arbitrary_name_which_you_like"
    server      "localhost"
}

и перезапустите mpd, чтобы изменения вступили в силу.

#Note there is `sudo` prefix.
sudo systemctl restart mpd

Вот и все.


Дополнение:

Кстати, тот факт, что aplay -D default jingle.wavудалось, а mpc playнет, происходит из-за разницы в рабочем пространстве, т.е. запущенной системы -в масштабе или в качестве сеанса пользователя. Так что сравнивать результаты бессмысленно. Я должен был сравнить mpc playс sudo -u mpd aplay -D default jingle.wav. Последняя команда завершается ошибкой, и это ожидаемый результат.

0
29.03.2021, 15:24
3 ответа

если поля данных следуют за строкой заголовка в каждом файле, вы можете сделать:

awk -F, 'FNR==1{ for(i=1; i<=NF; i++) if($i=="ip") break; next }
               { print $1, $i }' log*.csv
3
28.04.2021, 22:56

Использованиеcsvkit:

$ csvcut -c hostname,ip log1.csv
hostname,ip
abc,192.168.168.168
def,192.168.168.169
ghi,192.168.168.170
$ csvcut -c hostname,ip log2.csv
hostname,ip
abc,192.168.168.168
def,192.168.168.169
ghi,yyy

Команда csvcutнемного похожа на стандартную команду cut, но может использовать информацию заголовков для извлечения именованных столбцов.

Обратите внимание, что это зависит от правильности заголовков в каждом файле.

1
28.04.2021, 22:56

Если у вас есть файлы с заголовками, часто лучше сначала создать сопоставление тегов заголовков (имен )с порядком полей (столбцов ), хранящихся в массиве f[]ниже, а затем можно просто получить значения поля, разыменовав массив, индексированный по имени поля. Таким образом, ваш скрипт будет работать независимо от порядка столбцов в каждом входном файле :

.
$ cat tst.awk
BEGIN { FS="," }
FNR==1 {
    delete f
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
    next
}
$(f["hostname"]) == h { print $(f["hostname"]), $(f["ip"]) }

$ awk -v h='def' -f tst.awk log*.csv
def 192.168.168.169
def 192.168.168.169
1
28.04.2021, 22:56

Теги

Похожие вопросы