
Я наткнулся наэтотпост, который объясняет мою проблему. Предположим, есть файл, который называется file.txt
, который содержит "foo World".
Ответ, опубликованный Тайлером, многое объясняет, однако я не понимаю, как
cat file.txt | grep "foo"
похож на
grep "foo" file.txt
Я думал, grep
что требуется следующее
grep input argument // input is the string to search for (i.e) foo and
// argument is the file path (./file.txt)
Теперь вывод - cat file.txt
это содержимое файла, которое foo World
становится вводом grep
? Я прав? Если так, то я думал, grep
что требуется путь к файлу в виде строки?
решение1
Большинство команд могут работать с входными данными, которые представляют собой либо файл, который необходимо открыть для ввода, либо поток данных, передаваемый команде через STDIN.
Когда содержимое cat file.txt
отправляется другой команде через канал ( |
), вывод через STDOUT, который передается в канал с левой стороны, настраивается и передается команде, которая находится с правой стороны STDIN канала.
Если содержимое не передается через STDOUT -> STDIN через канал, то команды могут получать данные, открывая файлы, которые передаются по имени через аргументы командной строки.
Примеры
Отправляет вывод в STDOUT.
$ cat file
1
2
3
4
5
Вывод cat file
отправляется через STDOUT в grep
STDIN через канал.
$ cat file | grep 5
5
Обработка файла как аргумента командной строки.
$ grep 5 file
5
Обработка содержимого файла напрямую через STDIN.
$ grep 5 < <(cat file)
5
Здесь я демонстрирую, что содержимое file
может быть направлено grep
через STDIN выше.