awk
раствор:
awk 'BEGIN{ FS=OFS="," }$2 ~ /^"arn:aws:iam:/{ $2 = ","$2 }1' file.csv
$2 ~ /^"arn:aws:iam:/
-, если второе поле $2
начинается с"arn:aws:iam:
$2 = ","$2
-добавьте ко второму значению поля,
Выход:
"ADFS-Administrators","Administrator-Access","arn:aws:iam::279052847476:saml-provider/companyADFS"
"ADFS-amtest-ro",,"arn:aws:iam::279052847476:saml-provider/companyADFS"
"AWSAccCorpAdmin",,"arn:aws:iam::279052847476:saml-provider/LastPass"
"AWScompanyCorpAdmin",,"arn:aws:iam::279052847476:saml-provider/LastPass"
"AWScompanyCorpPowerUser",,"arn:aws:iam::279052847476:saml-provider/LastPass"
"flowlogsRole","oneClick_flowlogsRole_1495032428381",
"companyDevShutdownEC2Instaces","oneClick_lambda_basic_execution_1516271285849",
"companySAMLUser",,"arn:aws:iam::279052847476:saml-provider/companyAzureAD"
"lambda_stop_rundeck_instance","oneClick_lambda_basic_execution_1519651160794",
"OneLoginAdmin",,"arn:aws:iam::279052847476:saml-provider/OneLoginAdmin"
"OneLoginDev",,"arn:aws:iam::279052847476:saml-provider/OneLoginDev"
"vmimport","vmimport",
"workspaces_DefaultRole","SkyLightServiceAccess",
Причина, по которой ваш конвейер не завершается, заключается в том, что оператор exit 1
завершает только подоболочку правой стороны.
После того, как правая сторона имеет выход, команда date
, которую вы используете для генерации данных, начнет давать сбой, поскольку она не может никуда записать свой вывод (она будет уничтожена сигналом PIPE
)]. Вы не проверяете статус выхода date
, поэтому не видите этого.
Переписать левую часть как
(
while true; do
if ! date; then
exit # or: break
fi
sleep 1
done
)
или как
(
while date; do
sleep 1
done
)
заставит конвейер в целом вести себя так, как вы ожидаете.
Это указывает на то, что данные -, производящие двоичные файлы, которые находятся в левой части конвейера, не проверяют успешность записи или нет (, а также могут игнорировать сигнал PIPE
). Закрытие стандартного ввода в подоболочке с правой стороны не помогло бы (это уже сделано, когда вы все равно выходите из этой подоболочки ).
Это ошибка в программе, которая создает данные.
Как это обойти?
Один из способов — использовать именованный канал. Это позволит вам получить PID процесса, производящего данные -, который впоследствии можно будет использовать для его уничтожения :
.#!/bin/bash
rm -f data.pipe
mkfifo data.pipe
( while true; do date; sleep 1; done ) >data.pipe & pid=$!
(
for ((i = 0; i < 3; i++)); do
read -r line
printf 'LINE: %s\n' "$line"
sleep 1
done
kill "$pid"
exit 1
) <data.pipe
Если программа игнорирует сигнал PIPE
, вполне возможно, что она игнорирует и другие сигналы, поэтому вам придется сначала поэкспериментировать с отправкой стандартного TERM
, а если это не сработает, попробуйте INT
и т. д.