Необходимо будет, вероятно, добавить правило UDEV обнаружить это присутствие устройств. После того как устройство обнаруживается, UDEV может создать соответствие /dev/sdb1
соглашаться с ним.
Эти документы от OpenSUSE должны запустить Вас в создании этого правила.
Относительно Вашего вопроса:
"..., но разве я не должен мочь найти родительский узел в/sys для этого? И я ничего не могу найти..."
Я ожидал бы это, если ядро успешно обнаружило /dev/sdb1
, который это имеет, так как Вы вкладываете те сообщения Ваш dmesg
журнал, затем у Вас были бы соответствующие записи под /sys
.
Я занялся бы расследованиями /sys
более тщательно, там вероятно дескриптор устройства, скрывающийся там, который соответствует /dev/sdb1
. Можно идти вокруг дерева с помощью этой команды: udevadm info -a -p /sys/class/...
необходимо будет прибавить соответствующее устройство вместо точек (...
).
$ udevadm info -a -p /sys/class/ata_device/dev1.0
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/link1/dev1.0/ata_device/dev1.0':
KERNEL=="dev1.0"
SUBSYSTEM=="ata_device"
DRIVER==""
ATTR{gscr}==""
ATTR{class}=="ata"
ATTR{ering}=="[4294667.658000000]Unknown"
ATTR{spdn_cnt}=="0"
ATTR{pio_mode}=="XFER_UDMA_7, XFER_UDMA_6, XFER_UDMA_5, XFER_UDMA_4, XFER_MW_DMA_4, XFER_PIO_6, XFER_PIO_5, XFER_PIO_4, XFER_PIO_3, XFER_PIO_2, XFER_PIO_1, XFER_PIO_0"
ATTR{dma_mode}=="XFER_UDMA_7, XFER_UDMA_6, XFER_UDMA_5, XFER_UDMA_4, XFER_UDMA_3, XFER_UDMA_2, XFER_UDMA_1, XFER_UDMA_0, XFER_MW_DMA_4, XFER_MW_DMA_3, XFER_MW_DMA_2, XFER_SW_DMA_2, XFER_PIO_6, XFER_PIO_5, XFER_PIO_4, XFER_PIO_3, XFER_PIO_2"
ATTR{xfer_mode}=="XFER_UDMA_7, XFER_UDMA_6, XFER_UDMA_5, XFER_UDMA_4, XFER_UDMA_3, XFER_UDMA_2, XFER_UDMA_1, XFER_UDMA_0, XFER_MW_DMA_4, XFER_MW_DMA_3, XFER_MW_DMA_2, XFER_SW_DMA_2, XFER_PIO_6, XFER_PIO_5, XFER_PIO_4, XFER_PIO_3, XFER_PIO_2"
looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/link1/dev1.0':
KERNELS=="dev1.0"
SUBSYSTEMS==""
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/link1':
KERNELS=="link1"
SUBSYSTEMS==""
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1':
KERNELS=="ata1"
SUBSYSTEMS==""
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:1f.2':
KERNELS=="0000:00:1f.2"
SUBSYSTEMS=="pci"
DRIVERS=="ahci"
ATTRS{irq}=="40"
ATTRS{subsystem_vendor}=="0x17aa"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x010601"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{dma_mask_bits}=="64"
ATTRS{local_cpus}=="00000000,00000000,00000000,0000000f"
ATTRS{device}=="0x3b2f"
ATTRS{msi_bus}==""
ATTRS{local_cpulist}=="0-3"
ATTRS{vendor}=="0x8086"
ATTRS{subsystem_device}=="0x2168"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="1"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
попробуйте
awk '/mail:|fullName:/{s=s", "$0} /uid:/ {s=s", "$0 "\n" ;} END{printf substr(s,3)}' dump2.txt
, если в поле нет%
другое решение
awk '/mail:|fullName:/{s=s", "$0} /uid:/ {print substr(s,3) ", "$0 ;s=""} ' dump2.txt
при условии, что uid: последний.
вам просто нужно добавить \ n
в желаемое место:
awk '/mail:|fullName:|uid:/{s=s", "$0}\n END{print substr(s,3)}' dump2.txt
Другой прием: не храните все в одной большой строке, распечатайте ее по мере продвижения:
awk '$1=="mail:" || $1=="fullName:" {printf "%s, ", $0} $1=="uid:"' dump2.txt
Примечание: все нижеприведенное (очевидно) предполагает, что строка uid:
всегда будет последним в каждой группе.
Однако все они работают с символами %
в данных.
Если вы хотите сохранить все данные и распечатать их в конце, вот несколько простой подход с использованием массивов:
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count] = s[count] ", " $0} /uid:/ {count++}
END {for (i=0; i<count; i++) print substr(s[i],3)}' dump2.txt
Если вы хотите иметь возможность обрабатывать поля индивидуально (в конце), используйте двумерный массив:
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%s, %s, %s\n",
s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt
(Как и ответ Гленна, здесь предполагается, что строки mail:
, fullName:
и uid:
отображаются как первое поле в строке.)
Я не знаю, что вы имели в виду, когда упомянули выравнивание, но отсюда легко выровнять поля в выводе:
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%23s, %23s, %s\n",
s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt
➘
mail: (скрытый) fullName: Bogus Bogus, uid: 666 почта: (скрыто) fullName: Bogus2 Bogus2, uid: 667или
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%-23s, %-23s, %s\n",
s[i]["mail:"], s[i]["fullName:"], s[i]["uid:"]}' dump2.txt
➘
mail: (скрыто), полное имя: Bogus Bogus, uid: 666 почта: (скрыто), полное имя: Bogus2 Bogus2, uid: 667или
awk 'BEGIN {count=0}
/mail:|fullName:|uid:/ {s[count][$1] = $0} /uid:/ {count++}
END {for (i=0; i<count; i++) printf "%-23s %-24s %s\n",
s[i]["mail:"] ",",
s[i]["fullName:"] ",",
s[i]["uid:"]}' dump2.txt
➘
mail: (скрыто) fullName: Bogus Bogus, uid: 666 почта: (скрыто) fullName: Bogus2 Bogus2, uid: 667
Этот ответ показывает, как определить максимальную длину данных для каждого поля.