Конвейеры командной строки

10.2 Конвейеры командной строки

Символ вертикальной черты | можно использовать для отправки вывода одной команды другой. Как правило, когда команда имеет выходные данные или генерирует ошибку, выходные данные отображаются на экране; однако это не обязательно так. Вместо вывода на экран вывод одной команды становится вводом для следующей команды. Этот инструмент может быть мощным, особенно при поиске конкретных данных; конвейер часто используется для уточнения результатов исходной команды.

В предыдущих примерах командам headи tailбыли переданы файлы в качестве аргументов для работы. Однако символ вертикальной черты позволяет использовать эти команды не только для файлов, но и для вывода других команд. Это может быть полезно при перечислении большого каталога, например /etcкаталога:

sysadmin@localhost:~$ ls /etc
X11                     gss              mke2fs.conf     rpc
adduser.conf            host.conf        modprobe.d      rsyslog.conf
alternatives            hostname         modules         rsyslog.d
apparmor                hosts            modules-load.d  securetty
apparmor.d              hosts.allow      motd            security
apt                     hosts.deny       mtab            selinux
bash.bashrc             init.d           nanorc          services
bind                    initramfs-tools  netplan         shadow
bindresvport.blacklist  inputrc          network         shadow-
binfmt.d                insserv.conf.d   networks        shells
ca-certificates         iproute2         newt            skel
ca-certificates.conf    issue            nsswitch.conf   ssh
calendar                issue.net        opt             ssl
console-setup           kernel           os-release      subgid
cron.d                  ld.so.cache      pam.conf        subgid-
cron.daily              ld.so.conf       pam.d           subuid
cron.hourly             ld.so.conf.d     passwd          subuid-
cron.monthly            ldap             passwd-         sudoers
cron.weekly             legal            perl            sudoers.d
crontab                 libaudit.conf    pinforc         sysctl.conf
dbus-1                  locale.alias     ppp             sysctl.d
debconf.conf            locale.gen       profile         systemd
debian_version          localtime        profile.d       terminfo
default                 logcheck         protocols       timezone
deluser.conf            login.defs       python3         tmpfiles.d
depmod.d                logrotate.conf   python3.6       ucf.conf
dhcp                    logrotate.d      rc0.d           udev
dpkg                    lsb-release      rc1.d           ufw
environment             machine-id       rc2.d           update-motd.d
fstab                   magic            rc3.d           updatedb.conf
gai.conf                magic.mime       rc4.d           vim
groff                   mailcap          rc5.d           vtrgb
group                   mailcap.order    rc6.d           wgetrc
group-                  manpath.config   rcS.d           xdg
gshadow                 mc               resolv.conf
gshadow-                mime.types       rmt

Предыдущая команда перечисляет большое количество файлов. Если вы выполните это в нашем терминале, вывод будет обрезан и может быть просмотрен только при прокрутке вверх. Чтобы упростить просмотр начала вывода, передайте его в headкоманду. В следующем примере отображаются только первые десять строк:

sysadmin@localhost:~$ ls /etc | head
X11
adduser.conf
alternatives
apparmor
apparmor.d
apt
bash.bashrc
bind
bindresvport.blacklist
binfmt.d

Полный вывод команды lsпередается команде headоболочкой вместо вывода на экран. Команда headпринимает этот вывод от lsкоманды в качестве входных данных, а вывод headзатем выводится на экран.

Несколько каналов могут использоваться последовательно для связывания нескольких команд вместе. Если три команды передаются вместе, выходные данные первой команды передаются второй команде. Затем вывод второй команды передается третьей команде. Затем вывод третьей команды будет напечатан на экране.

Важно тщательно выбирать порядок, в котором команды передаются по каналу, так как каждая команда видит только ввод из предыдущей команды. Примеры ниже иллюстрируют это с помощью nlкоманды, которая добавляет номера строк к выходным данным. В первом примере nlкоманда используется для нумерации строк вывода предыдущей lsкоманды:

sysadmin@localhost:~$ ls /etc/ssh | nl
     1  moduli
     2  ssh_config
     3  ssh_host_ecdsa_key
     4  ssh_host_ecdsa_key.pub
     5  ssh_host_ed25519_key
     6  ssh_host_ed25519_key.pub
     7  ssh_host_rsa_key
     8  ssh_host_rsa_key.pub
     9  ssh_import_id
    10  sshd_config

Обратите внимание, что в следующем примере lsкоманда выполняется первой, и ее вывод отправляется команде nl, нумеруя все строки из вывода команды ls. Затем tailкоманда выполняется, отображая последние пять строк из вывода команды nl:

sysadmin@localhost:~$ ls /etc/ssh | nl | tail -5
     6  ssh_host_ed25519_key.pub
     7  ssh_host_rsa_key
     8  ssh_host_rsa_key.pub
     9  ssh_import_id
    10  sshd_config

Сравните вывод выше со следующим примером:

sysadmin@localhost:~$ ls /etc/ssh | tail -5 | nl
     1  ssh_host_ed25519_key.pub
     2  ssh_host_rsa_key
     3  ssh_host_rsa_key.pub
     4  ssh_import_id
     5  sshd_config

Обратите внимание, как отличаются номера строк.

Во втором примере вывод команды lsсначала отправляется команде tail, которая захватывает только последние пять строк вывода. Затем tailкоманда отправляет эти пять строк команде nl, которая их нумерует 1- 5.

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

Last updated