Linux, вопрос по символу |

Linux, вопрос по символу |

15.12.2015 07:43:26 Просмотров 25 Источник

Для чего в некоторых консольных командах используется знак | (вертикальная черта)?

У вопроса есть решение - Посмотреть?

Ответы - Linux, вопрос по символу | / Linux, вопрос по символу |

Является ответом!
etki

15.12.2015 07:50:14

Это так называемый конвейер, позволяющий передать вывод одной команды непосредственно на вход другой. Например, ls | wc -l передаст вывод команды ls команде wc -l, и таким образом осуществится подсчет количества записей в текущем каталоге - ls выдаст текст (на самом деле, набор байт), состоящий из нескольких строк, а wc -l их посчитает. А cat file.txt | grep -i michael передаст содержимое file.txt на вход команды grep, которая найдет все строки с вхождением michael.

Более подробно можно почитать тут.

https://ru.stackoverflow.com/questions/474747/linux-%d0%b2%d0%be%d0%bf%d1%80%d0%be%d1%81-%d0%bf%d0%be-%d1%81%d0%b8%d0%bc%d0%b2%d0%be%d0%bb%d1%83/474748#comment536756_474748
Добавлю, что по-английски обычно называется pipe.
Monoceros

15.12.2015 07:53:17

"труба" используется для передачи стандартного вывода одной программы в стандартный ввод другой. Например можно написать

grep bla-bla file.txt

Тогда грип будет искать текст bla-bla в файле file.txt . Но Грип загружает весь файл в память и ему может этой самой памяти не хватить и он вывалится в ошибку. Тогда мы можем передать этот файл построчно:

cat file.txt | grep bla-bla

В этом случае программа cat считывает построчно файл и передаст каждую отдельную строчку grep`у и он не утыкается в полку памяти.

https://ru.stackoverflow.com/questions/474747/linux-%d0%b2%d0%be%d0%bf%d1%80%d0%be%d1%81-%d0%bf%d0%be-%d1%81%d0%b8%d0%bc%d0%b2%d0%be%d0%bb%d1%83/474750#comment536850_474750
С чего вы собственно взяли, что в первом случае grep загрузит весь файл в память?
https://ru.stackoverflow.com/questions/474747/linux-%d0%b2%d0%be%d0%bf%d1%80%d0%be%d1%81-%d0%bf%d0%be-%d1%81%d0%b8%d0%bc%d0%b2%d0%be%d0%bb%d1%83/474750#comment536886_474750
На практике. Обрабатывал большой файл при прямом скармливании грип падал, поглащая память. Была Centos6. А Вы считаете, что он тоже построчно считывает файл?
https://ru.stackoverflow.com/questions/474747/linux-%d0%b2%d0%be%d0%bf%d1%80%d0%be%d1%81-%d0%bf%d0%be-%d1%81%d0%b8%d0%bc%d0%b2%d0%be%d0%bb%d1%83/474750#comment536929_474750
При построчном разборе файла существует возможность наличия одной очень длинной строки, которая вызовет ООМ.
https://ru.stackoverflow.com/questions/474747/linux-%d0%b2%d0%be%d0%bf%d1%80%d0%be%d1%81-%d0%bf%d0%be-%d1%81%d0%b8%d0%bc%d0%b2%d0%be%d0%bb%d1%83/474750#comment537049_474750
И grep и cat тоже работают не построчно, а через кольцевой буфер. Читают и пишут блоками. И могут вывести часть строки, потом продолжение, сразу несколько строк и кусок последней и т.д. grep ещё и динамически меняет размер буфера, но это не связанно откуда он читает данные, а зависит от самих данных и опций.
Закрыть X