оцените несколько шаблонов от вывода программы и записи в шаблон определенные файлы

Ответ Steven Pritchard хорош, но я думал, что предложу другую презентацию подобной информации.

Каждый процесс работает как определенный пользователь ¹. Пользователь идентифицируется числом, идентификатором пользователя, который хранится в информации о процессе, доступной только ядру. Пользователь, идентификатор пользователя которого 0, имеет специальные полномочия и обычно звонится root; имя rootне является особенным для ядра (но если Вы измените его, то Вы, вероятно, перепутаете много приложений). Много вещей, таких как загружающиеся модули ядра, получая доступ к большинству устройств непосредственно, и так далее, требуют, что процесс, который выполняет действие работать как идентификатор пользователя 0 ².

Когда начальные загрузки системы, первый процесс, запущенный ядром, работают как суперпользователь. Тот процесс, названный init, в конечном счете запускает много системных служб (cron, syslogd, …) и программы входа в систему (login, sshd, и т.д.).

Когда Вы входите в систему, Вы вводите учетные данные (имя, пароль, …), и программа входа в систему проверяет их. Если учетные данные приняты, изменения программы входа в систему в Вашем идентификаторе пользователя (это - одно из полномочий, предоставленных суперпользователю).

При завинчивании пользовательской базы данных (который маловероятен, если Вы не обходите редактирование или удаление случайных файлов как корень), Вы не можете входить в систему больше. Вы все еще сможете загрузиться в однопользовательский режим или с живого CD для восстановления системы.

Программа sudo позволяет Вам команды выполнения как корень. Обычно, если Вы запускаете программу, она наследовала идентификатор пользователя процесса, который запустил ее. Но sudo корень setuid: это - исключение, определенное битами полномочий на /usr/bin/sudo, это заставляет его работать как идентификатор пользователя 0 вместо этого. sudo проверки, позволяется ли пользователь, который вызвал, выполнить команду с поднятыми полномочиями (путем консалтинга /etc/sudoers), и или выполнения команда или сигналы ошибка.

¹ Иногда больше чем один, но это не подойдет в этом ответе.
² Или имеют правильную возможность, но не берут в голову это на данный момент.

4
16.12.2011, 16:38
5 ответов

Это - идеальный вариант использования для утилиты pee.

./runme.sh | pee "grep ook >> ook.out" "grep eek >> eek.out"

В Debian и производных, pee найден в moreutils пакет.

6
27.01.2020, 20:44
  • 1
    , который был хорош один Потрясающий minaev :-) –  Nikhil Mulley 16.12.2011, 14:34
  • 2
    я должен сказать, что думаю ответ @Nikhil, более универсален, когда Вы не смогли pee во всех системах. –  cwd 07.01.2012, 17:12
  • 3
    Ничего себе. Удача всем гуглящим страницу справочника. –  Victor Sergienko 09.01.2018, 21:21

Необходимо сделать egrep для обоих шаблонов затем.

'/.runme.sh | egrep "ook|eek"

но кажется, что необходимо перенаправить каждый вывод оценки шаблона в его собственный файл, который grep, кажется, не поддерживает. Любой, исправьте меня, если это возможно.

Править: minaev дал рабочий пример с мочой от moreutils, но если моча отсутствует на Вашей платформе, мы можем все еще использовать мишень как это. Просто игра с заменой процесса.

./runme.sh |tee >(grep ook > ook.txt) >(grep eek > eek.txt)

Пример:

[centos@centos scripts]$ ./runme.sh
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ ./runme.sh | tee >(grep eek >eek.txt) >(grep ook >ook.txt)
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ cat eek.txt 
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
[centos@centos scripts]$ cat ook.txt 
keekookjsfskooeek
ook
[centos@centos scripts]$ 
7
27.01.2020, 20:44

Я предполагаю, что runme является или длительной командой или требует атомарности (выполнения однажды).

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

TMPFILE=$(mktemp)
./runme.sh > $TMPFILE
grep 'ook' $TMPFILE >> ook.out
grep 'eek' $TMPFILE >> eek.out
\rm -f $TMPFILE
3
27.01.2020, 20:44
  • 1
    См. ответ Nikhil для умного использования tee... –  Sardathrion - Reinstate Monica 16.12.2011, 14:53
  • 2
    я видел это, таким образом, я признаю ошибку на использовании tee Мои старые узнают, что молитва Linux - изучает что-то повседневное новое, пробует его, практикует его, помнит это. –  bsd 16.12.2011, 18:05
  • 3
    @dbowning: Tru dat. –  Sardathrion - Reinstate Monica 16.12.2011, 18:07

Простое awk альтернатива:

./runme.sh | awk '/ook/{print>>"ook.out"}/eek/{print>>"eek.out"}'

С небольшим дополнением awk код может быть сделан легко расширяемым – просто вставленный в массив r, поскольку много пар выходного файла регулярного выражения необходимы:

./runme.sh | awk 'BEGIN{r["ook"]="ook.out";r["eek"]="eek.out"}{for(i in r)if($0~i)print>>r[i]}'

sed w команда эквивалентна из >, печально нет никакого способа добавить в файл:

./runme.sh | sed -n $'/ook/wook.out\n/eek/week.out'
6
27.01.2020, 20:44

Мишень команды может сохранить копию переданного по каналу потока во временном файле. Затем мы можем grep исходный stdout и также временный файл отдельно:

./runme.sh |tee temp |grep ook >>ook.out;grep eek temp >>eek.out
2
27.01.2020, 20:44

Теги

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