Можем ли мы запустить сводку, чтобы сделать 1 запись для нескольких записей в Linux

/dev/ptmxявляется стандартным, /dev/pts/ptmxдобавляется для программных контейнеров (Docker и т. д. )и других случаях, когда вам нужно несколько экземпляров файловой системы devpts.

Природа узлов устройств

Вы должны понимать, что «волшебство» узла устройства заключается не в его имени, а в старшем и второстепенном номерах устройств , для воплощения которых он создан.

Например, если у вас есть соответствующие привилегии, вы можете использовать mknodдля создания узла символьного устройства со старшим 1 и младшим 3 с любым именем в любой файловой системе в стиле Unix -и -, если только файловая система имеет параметр монтирования nodev-, она будет вести себя точно так же, как /dev/null, потому что во всех смыслах и целях она будет другой реализацией /dev/null.

Точно так же и /dev/pts/ptmx, и /dev/ptmxявляются символьными устройствами со старшим номером 5 и младшим номером 2. Таким образом, они обеспечивают доступ к точно таким же функциям в ядре.

$ ls -l /dev/ptmx /dev/pts/ptmx
crw-rw-rw- 1 root tty  5, 2 Jun 12 20:14 /dev/ptmx
c--------- 1 root root 5, 2 Jun 12 12:26 /dev/pts/ptmx

Тип символа узла устройства (или блока )и старший и младший номера устройства вместе определяют, с каким драйвером устройства ядра взаимодействует этот узел устройства. Ядро не заботится об именах -, оно предоставляет имена по умолчанию для udev,но вы можете полностью изменить схему именования устройств, если хотите. При необходимости вы можете создавать узлы устройств за пределами /dev.

В Debian 9 для разрешения /dev/pts/ptmxпо умолчанию установлено значение 000, поэтому предполагается, что оно не будет использоваться. Аналогично в RHEL 7.5.

Комментарий в исходном коде ядра 4.17 говорит:

/*
 * ptmx is a new node in /dev/pts and will be unused in legacy (single-
 * instance) mode. To prevent surprises in user space, set permissions of
 * ptmx to 0. Use 'chmod' or remount with '-o ptmxmode' to set meaningful
 * permissions.
 */

«режим одиночного экземпляра -» относится к использованию в качестве системы, соответствующей стандартам UNIX98 и Single Unix Specification v1. Поэтому очень важна обратная совместимость.

Возможность использования нескольких экземпляров -для devptsбыла разработана для поддержки контейнеров. В этом можно убедиться, прочитав старые версии /Documentation/filesystems/devpts.txtот 2009 года или около того :

.

To support containers, we now allow multiple instances of devpts filesystem, such that indices of ptys allocated in one instance are independent of indices allocated in other instances of devpts.

To preserve backward compatibility, this support for multiple instances is enabled only if:

  • CONFIG_DEVPTS_MULTIPLE_INSTANCES=y, and
  • '-o newinstance' mount option is specified while mounting devpts

IOW, devpts now supports both single-instance and multi-instance semantics.

Когда используются контейнеры, они обычно инициализируют совершенно новое пространство имен для псевдо -TTY и могут монтировать другой экземпляр файловой системы devptsвнутри контейнера (, это можно даже опустить, если псевдо -] Поддержка TTY внутри контейнера не требуется ). Наличие записи ptmxв файловой системе devptsможет быть полезно для минимизации работы, необходимой для инициализации среды контейнера in -.

3
07.05.2020, 11:28
3 ответа

Я бы не стал использовать для этого саму оболочку.

Другая реализация awk

$ awk 'BEGIN{OFS=FS="|"} {split($NF,a,","); for(i in a) {$NF = a[i]; print}}' data
 ABC|RAM|BANGALORE|100
 ABC|RAM|BANGALORE|200
 ABC|RAM|BANGALORE|300

или с Миллером

$ mlr --nidx --fs '|' nest --explode --values --across-records --nested-fs ',' -f 4 data
 ABC|RAM|BANGALORE|100
 ABC|RAM|BANGALORE|200
 ABC|RAM|BANGALORE|300

или более компактно

mlr --nidx --fs '|' nest --evar ',' -f 4 data

Если вам действительно нужно использовать оболочку, то с соответствующим недавним bash:

#!/bin/bash

while IFS='|' read -a fields; do 
  IFS=',' read -a vals <<<"${fields[ -1]}"
  unset 'fields[ -1]'
  for v in "${vals[@]}"; do
    printf '%s|' "${fields[@]}" 
    printf '%s\n' "$v"
  done 
done < data
7
28.04.2021, 23:16

Например:

#!/usr/bin/env sh

s="ABC|RAM|BANGALORE|100,200,300"

header="$(echo "$s" | rev | cut -d'|' -f2- | rev)"

list="$(echo "$s" | rev | cut -d'|' -f1 | rev)"

IFS=','
for i in $list
do
    printf "%s|" "$header"
    printf "%s\n" "$i"
done

Выход:

ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300
3
28.04.2021, 23:16

С awk:

awk -F "," '                      #Sets field separator to,
    NF<2{print;next}
    {
        print $1                  #Print first line up to,
        sub(/[^|]*$/,"",$1)       #Remove all that is after | in $1
        for(i=2;i<=NF;i++){       #Print each remaining field after the first field
            printf "%s%s\n",$1,$i
        }
    }
' file

Пример файла:

ABC|RAM|BANGALORE|100,200,300
ABC|BA00|
ABC|RAM|BANGALO00|200,300

Выход:

ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300
ABC|BA00|
ABC|RAM|BANGALO00|200
ABC|RAM|BANGALO00|300
4
28.04.2021, 23:16

Теги

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