Ik kwam deze post tegen die mijn probleem verklaart. Stel dat er een bestand is met de naam file.txt
dat “foo World” bevat.
Het antwoord van Tyler legt veel uit, maar ik weet niet hoe
cat file.txt | grep "foo"
is vergelijkbaar met
grep "foo" file.txt
Ik dacht dat grep
de volgende
grep input argument // input is the string to search for (i.e) foo and // argument is the file path (./file.txt)
Nu is de uitvoer van cat file.txt
de inhoud van het bestand dat dit wordt de invoer van de grep
? Ben ik correct? Als dat zo is, dacht ik dat grep
een bestandspad als string nodig had?
Opmerkingen
Answer
De meeste commandos kunnen omgaan met invoer die ofwel een bestand is dat ze moeten openen voor invoer, of als een gegevensstroom die via STDIN aan de opdracht wordt doorgegeven.
Wanneer de inhoud van cat file.txt
wordt naar een ander commando gestuurd via een pijp (|
) de output via STDOUT die naar de pijp aan de linkerkant wordt gestuurd, wordt ingesteld en gevoerd naar het commando dat “bevindt zich aan de rechterkant van de pijp” s STDIN.
Als de inhoud niet via STDOUT -> STDIN via een pijp wordt doorgegeven, kunnen commandos gegevens ontvangen door bestanden te openen die op naam worden doorgegeven via opdrachtregelargumenten.
Voorbeelden
Stuurt uitvoer naar STDOUT.
$ cat file 1 2 3 4 5
Uitvoer van cat file
wordt via STDOUT naar grep
” s STDIN gestuurd via de pipe.
$ cat file | grep 5 5
Het bestand verwerken als een opdrachtregelargument.
$ grep 5 file 5
De inhoud van het bestand rechtstreeks verwerken via STDIN.
$ grep 5 < <(cat file) 5
Hier ik “m om aan te tonen dat de inhoud van file
kan worden omgeleid naar grep
via STDIN hierboven.
grep(1)
man-pagina (typeman grep
), je ziet “grep [options] PATROON [FILE …]”. Het feit dat “FILE” wordt gevolgd door “…” betekent dat er meerdere bestandsargumenten kunnen zijn; het feit dat het tussen vierkante haken staat ([
…]
) betekent dat het bestandsargument optioneel is (dwz er is geen te zijn). Blijf lezen en u zult zien dat “ Grep zoekt in de benoemde invoerbestanden (of standaardinvoer als er geen bestanden zijn genoemd, of de bestandsnaam-
is gegeven)…. ” Dus: als er geen bestanden zijn gespecificeerd, zoekt grep de standaardinvoer.