Что такое хороший пример передачи по каналу команд вместе?

Попробуйте это: http://j3pd.wordpress.com/2011/08/31/upgrading-openssl/

Это говорит Вам, как проверить Вашу текущую версию, загрузите новейший, скомпилируйте его и установите его по старому

33
03.02.2012, 18:52
14 ответов

Я собираюсь обойти Вас через несколько сложный пример, на основе реального сценария.

Проблема

Скажем, команда conky остановленный ответ на моем рабочем столе, и я хочу уничтожить его вручную. Я знаю определенный Unix, таким образом, я знаю, что то, что я должен сделать, выполняют команду kill <PID>. Для получения PID я могу использовать ps или top или безотносительно оснащают мое распределение Unix, дал мне. Но как я могу сделать это в одной команде?

Ответ

$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill

Отказ от ответственности: Эта команда только работает в определенных случаях. Не делайте скопировать/вставить этого в своем терминале и начинайте использовать его, это могло уничтожить процессы unsuspectingly. Скорее изучите, как создать его.

Как это работает

1- ps aux

Эта команда произведет список выполнения процессов и некоторой информации о них. Интересная информация - то, что это произведет PID каждого процесса в его 2-м столбце. Вот извлечение из вывода команды на моем поле:

$ ps aux
 rahmu     1925  0.0  0.1 129328  6112 ?        S    11:55   0:06 tint2
 rahmu     1931  0.0  0.3 154992 12108 ?        S    11:55   0:00 volumeicon
 rahmu     1933  0.1  0.2 134716  9460 ?        S    11:55   0:24 parcellite
 rahmu     1940  0.0  0.0  30416  3008 ?        S    11:55   0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
 rahmu     1941  0.0  0.2 160336  8928 ?        Ss   11:55   0:00 xfce4-power-manager
 rahmu     1943  0.0  0.0  32792  1964 ?        S    11:55   0:00 /usr/lib/xfconf/xfconfd
 rahmu     1945  0.0  0.0  17584  1292 ?        S    11:55   0:00 /usr/lib/gamin/gam_server
 rahmu     1946  0.0  0.5 203016 19552 ?        S    11:55   0:00 python /usr/bin/system-config-printer-applet
 rahmu     1947  0.0  0.3 171840 12872 ?        S    11:55   0:00 nm-applet --sm-disable
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:38 conky -q

2- grep conky

Я только интересуюсь одним процессом, таким образом, я использую grep найти запись, соответствующую моей программе conky.

$ ps aux | grep conky
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q
 rahmu     3233  0.0  0.0   7592   840 pts/1    S+   16:55   0:00 grep conky

3- grep -v grep

Поскольку Вы видите на шаге 2, команде ps производит grep conky процесс в его списке (это - рабочий процесс, в конце концов). Для фильтрации его я могу работать grep -v grep. Опция -v говорит grep соответствовать всем строкам, исключая тех содержащих шаблон.

$ ps aux | grep conky | grep -v grep
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q

NB: я хотел бы знать способ сделать шаги 2 и 3 на сингле grep звонить.

4- awk '{print $2}'

Теперь, когда я изолировал свой целевой процесс. Я хочу получить его PID. Другими словами, я хочу получить 2-е слово вывода. Удачный для меня, большинство (все?) современные нельды обеспечат некоторую версию awk, язык сценариев, который делает чудеса с табличными данными. Наша задача становится столь же легкой как print $2.

$ ps aux | grep conky | grep -v grep | awk '{print $2}'
 1948

5- xargs kill

У меня есть PID. Все, в чем я нуждаюсь, должно передать его kill. Чтобы сделать это, я буду использовать xargs.

xargs kill будет читать из входа (в нашем случае от канала), формировать команду, состоящую из kill <items> (<items> то, что это считало из входа), и затем выполните созданную команду. В нашем случае это выполнится kill 1948. Миссия выполняется.

Заключительные слова

Обратите внимание, что в зависимости от того, какую версию Unix Вы используете, определенные программы могут вести себя немного по-другому (например, ps мог бы произвести PID в столбце 3$). Если что-то кажется неправильным или отличающимся, прочитайте документацию своего поставщика (или лучше, man страницы). Также будьте осторожны, поскольку длинные каналы могут быть опасными. Не делайте предположения особенно при использовании команд как kill или rm. Например, если был другой пользователь, названный 'носатым' (или 'Aconkyous'), моя команда может уничтожить все его рабочие процессы также!

То, что я говорю, быть осторожным, специально для длинных каналов. Всегда лучше создать его в интерактивном режиме, как мы сделали здесь, чем делают предположения и чувствуют себя виноватым позже.

34
27.01.2020, 19:37
  • 1
    я хотел бы знать способ сделать шаги 2 и 3 в единственном вызове grep.-> grep "носатый-q" :) –  Wolfy 09.02.2012, 21:20
  • 2
    На самом деле это - плохой пример, как Вы могли просто сделать kill $(pgrep conky) –  Patrick 10.02.2012, 12:14
  • 3
    я знаю это, является поздним, но Вы могли упростить его еще больше до pkill conky –  strugee 28.08.2013, 07:48
  • 4
    " ""NB: я хотел бы знать способ сделать шаги 2 и 3 в единственном вызове grep """. Вместо использования "aux" "-o pid, коммуникация" - это также более портативно, так как это совместимо POSIX. Тем путем процесс grep просто обнаружится как "grep" вместо "grep носатый", таким образом, он не будет соответствовать себе. –  Random832 26.11.2013, 17:56
  • 5
    , я хотел бы знать способ сделать шаги 2 и 3 на сингле grep звонить. grep [c]onky то, что Вы ищете. –  AlexT 16.03.2016, 11:26

Мой фаворит - этот:

youtube-dl $1 -q -o - | ffmpeg -i - $2

загружает видео с данного URL YouTube, мимо которого проходят $1 и выводы это как файл, данный $2. Отметьте, как файл бесшумно -q вывод к STDOUT -o -, переданный по каналу к ffmpeg и используемый в качестве входа там -i -.

Специально для новичков Linux это могло бы быть практическим примером, почему командная строка может быть полезной и сделать вещи легче, чем использование инструментов GUI. Я не уверен, сколько времени это взяло бы, чтобы загрузить видео с YouTube и преобразовать его звук в mp3. Вышеупомянутая строка может сделать это через несколько секунд.

15
27.01.2020, 19:37
  • 1
    есть опция только сохранить аудио. Моя обычная команда - это, где URL входят на stdin: youtube-dl --extract-audio --audio-format mp3 -a -. Все еще прохладный пример, но существуют более легкие способы сделать это. (Это называет ffmpeg внутренне.) –  Brigand 04.02.2012, 04:07
  • 2
    @FakeRainBrigand: Ха-ха, хороший для знания! Но я получил альтернативу, которая не должна быть встроена: youtube-dl $1 -q -o - | mplayer - непосредственно играет видео внутри mplayer. Я использую ту команду от своего ноутбука для сообщения моего сервера (который подключен к ТВ) играть видео. Я должен добавить -display :0.0 -geometry 400x300+1200+200 позволять mplayer окну появиться на корректном экране. –  Baarn 04.02.2012, 13:06

Общее использование (чтение: путем я использую его большинство времен), когда по некоторым причинам я должен выполнить некоторые данные через несколько инструментов для продолжения различных задач обработки.

Таким образом, я сказал бы, что использование каналов как связующее звено для сборки нескольких стандартных блоков (различные инструменты UNIX) вместе. Как сказанный Ulrich, sort и uniq общая строка файла конфигурации.

В зависимости от аудитории, если Вы хотите выделить это использование каналов, Вы могли бы, например, запустить с: "эй, эта программа имеет ссылки на несколько интересных PDFs с бумагами и примечаниями лекции, но некоторые из них повторяются. я могу так или иначе автоматизировать это?"

Затем Вы могли показать как lynx --dump --listonly получает список ссылок, как grep мог отфильтровать для ссылок, заканчивающихся в .pdf, как colrm или sed мог избавиться от чисел lynx записи оставлены каждому URL, как sort и uniq мог избавиться от дубликатов, и наконец как wget -i - может использоваться для получения файлов (использование --wait быть нежным на сервере, конечно).

Я боюсь, что это - сложный пример. С другой стороны, может помочь показу питания каналов, когда Вы просто передаете его по каналу и выполняли оболочку все это сразу.

9
27.01.2020, 19:37
  • 1
    Можно использовать sort -u в GNU coreutils также. –  Teresa e Junior 03.02.2012, 22:25

Я точно не знаю о хорошем, но передающий по каналу через grep должен быть один из наиболее популярных способов использования, возможно сопровождаемых wc -l. (Да, grep имеет малоизвестное -c переключатель.)

Другая общая строка файла конфигурации | sort | uniq, если только потому, что uniq требует, чтобы его вход был отсортирован.

2
27.01.2020, 19:37
  • 1
    Большинство людей предпочитает ... | sort -u при наличии! –   26.11.2013, 17:07

Это - первая вещь, которая пришла на ум для меня...

mysqldump консольное приложение, которое отправляет данные, схему и дополнительно процедуры и функции к stdout. Обычно это перенаправляется в файл для резервного копирования.

mysqldump <options> > mydb.dump

Это дало бы Вам несжатый sql сценарий. Для оставления свободного места Вы могли сжать его с bzip2.

bzip2 mydb.dump

С другой стороны, Вы могли сделать обоих за один шаг:

mysqldump <options> | bzip2 > mydb.dump.bz2

В этом примере выше, stdout от mysqldump передается по каналу к bzip2, которому затем перенаправили его вывод в файл.

1
27.01.2020, 19:37
  • 1
    Добавьте обратную операцию также: bzcat mydb.dump.bz2 | mysql <options>. –  manatwork 04.02.2012, 16:41

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

gawk '{ for (x=1;x<=NF;x++) if ( $x~"Access" && $(x+4)~".*@.*") print $(x+4)}' $OFILE | sort | uniq -c | sort -n
1
27.01.2020, 19:37

cat filename | less ужасное использование передачи по каналу, так как можно просто сделать less filename

Вот пример зернышек, что я использую каждый день (но может также быть плохой пример): ls -la | more -c

scott hoffman и ответы njsg являются лучшими примерами.

0
27.01.2020, 19:37

Вот пример, который я использовал для установки переменной ДИСПЛЕЯ, когда xauth не был опцией...

export DISPLAY=\`who am i |awk '{print $NF}' | sed 's/[()]//g'`":0.0"

Для первой команды были нужны данные, т.е., имя хоста или IP. Вторая команда добирается просто, что данные (длятся поле). Наконец, последняя команда разделяет круглую скобку от данных.

0
27.01.2020, 19:37

Не то, чтобы Вам нужен он для этого примера, но:

$ ps aux | grep -v grep | grep conky

... инвертирование порядка властей сохраняет колоризацию, но НАМНОГО менее эффективно. по-видимому, в больших списках, цвет не имел бы значения.

также, эта веб-страница предлагает:

https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

>Johnsyweb answered Feb 21 '12 at 10:31
>The usual trick is this:
>ps aux | grep '[t]erminal'
>This will match lines containing terminal, which grep '[t]erminal' does not!
>It also works on many flavours of Unix.

... но это не будет работать при поиске одной буквы (как процесс 'X').

2
27.01.2020, 19:37

Как насчет: поиск шаблона и дисплей последний происходящий шаблон?

Шоу, как использовать tail, sed и grep в контексте канала, который может быть создан шаг за шагом.

0
27.01.2020, 19:37

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

while read in; do host "$in"; done < sites.txt | grep -iv "GOOGLE" | grep -E '1\.2\.3\.4|5\.6\.7\.8' | sed -e 's/has\ address\ 216.70.91.72//' | sed -e 's/has\ address\ 94.23.33.92//' | while read sites; do curl -sL -w "%{http_code} %{url_effective}\\n" "$sites" -o /dev/null; done | grep -ivE '4.*|5.*' | sed -e 's/200//' | sed -e 's/HTTP/http/'

Она...

  1. Читает сайты. txt
  2. Запускает "host" на каждом (оглядываясь назад, dig+short сделал бы это намного проще)
  3. Удаляет строки, содержащие "GOOGLE" - это mx-записи
  4. Получает строки, содержащие один из двух IP
  5. Получает код статуса http от каждого сайта в списке
  6. Удаляет сайты, которые возвращают 4xx или 5xx
  7. Удаляет "200" из сайтов, которые возвращают это
  8. Заменяет "HTTP" на "http" - чисто эстетически, без реальной причины.

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

2
27.01.2020, 19:37

Каналы лучше всего работают с фильтрами и трансляторами

find /usr/bin/ |                #produce 
sed 's:.*/::'  |                #translate: strip directory part
grep -i '^z'   |                #filter   : select items starting with z
xargs -d '\n' aFinalConsumer    #consume  

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

1
27.01.2020, 19:37

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

Примеры.

  1. С помощью текстовых файлов вы можете передать текстовый файл программе grep для поиска определенных строк текста. Затем вы можете передать вывод в sed или awk, чтобы изменить или распечатать определенную часть строки.

cat example txt | grep {some_line} | awk {some_command}

  1. Работая с процессом, вы можете использовать конвейер для отправки команд на завершение процесса.

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

0
27.01.2020, 19:37

выполните этот в любой директории, которую вы хотите, чтобы сортировка анализировалась по размеру папки (затем прокрутите вниз с помощью клавиши END):

du -m| sort -n| less

Sortiert nach Ordnergrösse

0
27.01.2020, 19:37

Теги

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