Как выполнить поиск столбцов, совпадающих в одной строке?

Я скомпилировал shadow в ходе сборки Linux From Scratch 8.4, и я мог войти в систему как root или непривилегированный пользователь, но не мог su перейти от непривилегированного пользователя к root, как для Эрика выше. Оказалось, что бинарный файл su принадлежал моему непривилегированному пользователю. Это сработало после того, как я подключил двоичный файл su к root и сделал «chmod u + s» для двоичного файла su.

1
04.05.2020, 19:41
3 ответа

По сути, это укороченная версия подхода AdminBee:

$ subscription-manager list --installed | 
    awk '{
            if(sub(/^Product Name: */,"")){
                a=0; 
                n=$0;
                if(/<Server>/){ a++ }
            } 
          }/Ends/ && a{print n,$2}'  
Red Hat Enterprise Linux Server 27/11/20

Сценарий установит aв 0, если текущая строка начинается с Product Name:, поскольку мы хотим сбрасывать ее каждый раз, а затем, если в строке также есть строка Server, он установит ее к 1. Затем, если текущая строка начинается с Ends:и aне равно 0, будет напечатано второе поле.

Обратите внимание, что это также будет соответствовать Product Name:, содержащему notAServer, или любому другому элементу, содержащему Server. Чтобы ограничиться только совпадениями слов, вы можете использовать это вместо (, предполагая, что у вас есть gawk, GNU awk):

subscription-manager list --installed | 
    gawk '{if(sub(/^Product Name: */,"")){a=0; n=$0;if(/\<Server\>/){a++}} }/Ends/ && a{print n,$2}'
1
28.04.2021, 23:16

Обратите внимание, что сочетание awk, sedи grepдля одной задачи требуется редко. В вашем случае должно работать следующее:

subscription-manager list --installed | awk '$2=="Name:" && $0~/Server/ {relevant_section=1;print;} \
$1=="Ends:" && (relevant_section==1) {relevant_section=0;print;}'

Это установит флаг relevant_sectionв 1, если строка, начинающаяся с «Имя продукта :» (или, скорее, где второй разделяемый пробелом -токен равен Name:), содержит строку Server. Для удобства эта строка также печатается.

Когда встречается строка, начинающаяся с Ends:при установленном флаге 1, она печатает эту строку и сбрасывает флаг на 0.

Если вы действительно хотите напечатать только дату окончания, вы можете сократить ее как:

subscription-manager list --installed | awk '$2=="Name:" && $0~/Server/ {relevant_section=1;} \
$1=="Ends:" && (relevant_section==1) {relevant_section=0;print $2;}'
2
28.04.2021, 23:16

Использование Миллера

$ tail -n +4 subscriptions | mlr --xtab --ips : --ops ': ' \
    filter '${Product Name} =~ "Server"' then cut -f 'Product Name,Ends'
Product Name:    Red Hat Enterprise Linux Server
Ends:            27/11/20
0
28.04.2021, 23:16

Теги

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