Как я могу добавить случайную строку для каждой строки?

/ dev / tty - это управляющий tty текущего процесса для любого процесса, который фактически открывает этот специальный файл. Это не обязательно устройство виртуальной консоли ( / dev / tty n ), оно может быть , последовательным портом и т. Д. Если управляющий tty не является t виртуальная консоль, то процесс не должен взаимодействовать с консольными устройствами, даже если его псевдоним фактически реализован на системной консоли. Например,для оболочки в эмуляторе терминала под локально запущенным X-сервером указанные программы образуют такую ​​цепочку взаимодействий, как:

Unix shell
/ dev / pts / 2 ( ≡ / dev / tty для своих процессов)
драйвер pty ядра
/ dev / ptmx
эмулятор терминала
⇕ Протокол X Window
X-сервер
/ dev / tty7 (≡ / dev / tty для сервера)
системная консоль
z x c ↿⇂ [_̈░░]
пользователь

Использование / dev / tty пользовательскими программами включает:

  • Запись чего-либо в управляющий терминал, игнорируя все перенаправления и каналы;
  • Создание ioctl () - см. Tty_ioctl (4);
  • Для Например, отсоединить от терминала (TIOCNOTTY).

/ dev / tty0 - это текущая активная (т.е. видимая на мониторе) виртуальная консоль операционной системы . Этот специальный файл вряд ли широко используется системным программным обеспечением, но / dev / console фактически является «псевдонимом» для tty0 , а / dev / console имеет большое применение. демонами syslog, а иногда и самим ядром.

Эксперимент, чтобы показать разницу: запустите оболочку root на tty3 ( Ctrl + Alt + F3 ]) или в эмуляторе терминала. Теперь

# sleep 2; echo test >/dev/tty

, затем быстро Ctrl + Alt + F2 , подождите две секунды и Ctrl + Alt ] + что угодно назад.Где вы видите результат?
А теперь тот же тест для / dev / tty0 .

12
07.03.2018, 14:29
5 ответов

¿No crees que es un poco obvio? ¡Simplemente está generando una cadena aleatoria una vez y almacenándola en la variable rany usándola para todas las líneas!

Uso de getlineen una variable desde una tubería

awk '{
     str_generator = "tr -dc '[:alnum:]' </dev/urandom | head -c 6"
     str_generator | getline random_str
     close(str_generator)
     print "name " random_str " - " $0
}' file

Cuando usa command | getline var, la salida del comando se envía a través de una tubería a getline()y a la variable var.

También tenga en cuenta que cuando se abre una tubería para la salida, awkrecuerda el comando asociado con él, y las escrituras posteriores al comando se agregan a las escrituras anteriores. Necesitamos hacer una llamada explícita close()del comando para evitar eso.

Si las comillas simples anidadas -en str_generatorestán causando un problema, reemplácelas con su equivalente octal(\047)

awk '{
     str_generator = "tr -dc \047[:alnum:]\047 </dev/urandom | head -c 6"
     str_generator | getline random_str
     close(str_generator)
     print "name " random_str " - " $0
}' file
9
27.01.2020, 19:54

Ejecutar una instancia de tr -dc '[:alnum:]' </dev/urandom | head -c 6por línea de entrada sería contraproducente -, sería mejor que hiciera:

<input awk -v rng="LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6" '
  {rng | getline r; print "name"r"-"$0}'

Si su entrada no contiene acentos graves ni comillas simples, también puede usar m4'smkstemp():

<input sed "s/.*/mkstemp(name)\`&'/" | m4
8
27.01.2020, 19:54

Esta variación en un par de las otras respuestas genera cadenas aleatorias fuera deawk:

LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6 |
awk '{ getline r <"/dev/stdin"; printf("name%s-%s\n", r, $0) }' file

La canalización tr+ foldgenera un flujo interminable de cadenas aleatorias de seis -caracteres en la entrada estándar de awk. awkignorará la entrada estándar si se proporciona un nombre de archivo, por lo que estas cadenas aleatorias son leídas por getlinedesde /dev/stdina la variable r. printfluego se usa para prefijar las líneas del archivo con la cadena apropiada.

Dado el archivo

123
abc
@#$

esto puede producir

nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$
4
27.01.2020, 19:54
paste <(base64 -w6 /dev/urandom) input.txt | awk 'NF==2{print $1$2} NF!=2{exit}'

Требования-input.txt должен содержать только один столбец, другими словами, в нем не должно быть табуляции или пробелов, потому что они используют в качестве разделителя по умолчанию awkиpaste(только символ табуляции )команды. В противном случае команду необходимо немного изменить.

Примечание:Алфавит Base64 содержит символы +и /:Таблица Base64 , если вам нужны только цифры и буквы, вы можете использовать команду base32-Алфавит Base32 .

Вход

===my_line_a
===my_line_b
===my_line_c
===my_line_d
===my_line_e

===символов добавлено для ясности.

Выход

LYSdm8===my_line_a
5sSSNt===my_line_b
YVMdkA===my_line_c
3b/nsT===my_line_d
xt/AZO===my_line_e
0
27.01.2020, 19:54

Без использования awk, простоbash

while read line; do
    printf "name%s-%s\n" \
        "$(tr -dc '[:alnum:]' </dev/urandom|head -c6)" \
        "$line"
done <myfile
1
27.01.2020, 19:54

Теги

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