Статус выхода команды в конвейере

Вы можете попросить awk проверить, является ли поле числом, используя ~/^[0 -9]+/.

Вот небольшой сценарий оболочки, демонстрирующий это:

[root@tiny ~]# cat test.sh
#!/bin/bash

INPUT="API,20042017-01:00,341701,341701,100,480692,480692
API,20042017-02:00,293058,293058,100,415459,415459
API,20042017-03:00,272692,272692,100,388942,388942
API,20042017-04:00,279117,279115,100,399361,399361
API,20042017-04:00,279117,FRED,100,399361,399361
API,20042017-05:00,345947,345945,100,495306,495306"

echo "$INPUT" | awk -F, '$3 ~ /^[0-9]+/ && $4  ~ /^[0-9]+/ { print $1, $2, $3, $4, ($4/$3*100), $5, $6 }'

[root@tiny ~]#./test.sh
API 20042017-01:00 341701 341701 100 100 480692
API 20042017-02:00 293058 293058 100 100 415459
API 20042017-03:00 272692 272692 100 100 388942
API 20042017-04:00 279117 279115 99.9993 100 399361
API 20042017-05:00 345947 345945 99.9994 100 495306
[root@tiny ~]# 
3
02.05.2019, 13:04
1 ответ

Специальное перенаправление >&pв оболочке ksh93перенаправляет стандартный поток вывода на стандартный ввод команды, которая в данный момент выполняется как процесс -.

В приведенном примере команда tail -5была запущена как сопроцесс -с использованием |&, а с помощью exec >&pсценарий перенаправляет весь вывод оттуда в процесс tail(. ] только вывод catв примере ).

Исходный стандартный вывод сначала сохраняется как файловый дескриптор 4 с exec 4>&1(, а также в файловый дескриптор 4, который tailзаписывает ), а затем восстанавливается с exec >&4перед окончательным echo.

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

tail -n 5 /etc/passwd
printf 'exitcode = %d\n' "$?"

(хотя $exitcodeздесь будет статус выхода tail, а неcat)

4
27.01.2020, 21:17

Теги

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