Jag stötte på det här inlägget som förklarar mitt problem. Anta att det finns en fil som heter file.txt
som innehåller ”foo World”.
Svaret från Tyler förklarar mycket men jag är förvirrad över hur
cat file.txt | grep "foo"
liknar
grep "foo" file.txt
Jag trodde att grep
krävde följande
grep input argument // input is the string to search for (i.e) foo and // argument is the file path (./file.txt)
Nu är utdata från cat file.txt
innehållet i filen som är foo World
detta blir ingången till grep
? Har jag rätt? I så fall trodde jag att grep
krävde en filväg som en sträng?
Kommentarer
- I
grep(1)
man-sida (skrivman grep
) ser du ”grep [optioner] MÖNSTER [FIL …]”. Det faktum att ”FILE” följs av ”…” betyder att det kan finnas flera filargument; det faktum att det finns inom hakparenteser ([
…]
) betyder att filargumentet är valfritt (dvs. det finns inte att vara vilken som helst). Fortsätt läsa så ser du ” Grep söker i de namngivna inmatningsfilerna (eller standardinmatningen om inga filer heter, eller filnamnet-
ges)…. ” Så: om inga filer anges, söker grep standardinmatningen.
Svar
De flesta kommandon kan hantera mata in antingen en fil som de behöver öppna för inmatning eller som en dataström som skickas till kommandot via STDIN.
När innehållet i cat file.txt
skickas till ett annat kommando via ett rör (|
) utgången via STDOUT som skickas till röret på vänster sida, ställs in och matas till kommandot som ”s till höger om röret” s STDIN.
Om innehållet inte skickas via STDOUT -> STDIN via ett rör kan kommandon ta emot data genom att öppna filer som skickas med namn via kommandoradsargument.
Exempel
Skickar utdata till STDOUT.
$ cat file 1 2 3 4 5
Utdata från cat file
skickas via STDOUT till grep
” s STDIN via röret.
$ cat file | grep 5 5
Bearbetar filen som ett kommandoradsargument.
$ grep 5 file 5
Bearbetar innehållet i filen via STDIN direkt.
$ grep 5 < <(cat file) 5
Här jag ”m visar att innehållet i file
kan dirigeras till grep
via STDIN ovan.