Jeg stødte på dette indlæg, der forklarer mit problem. Antag, at der er en fil, der hedder file.txt
, som indeholder “foo World”.
Svaret fra Tyler forklarer meget, men jeg er forvirret over, hvordan
cat file.txt | grep "foo"
svarer til
grep "foo" file.txt
Jeg troede grep
krævede følger
grep input argument // input is the string to search for (i.e) foo and // argument is the file path (./file.txt)
Nu er output fra cat file.txt
indholdet af filen, der er foo World
dette bliver input til grep
? Har jeg ret? I så fald troede jeg grep
krævede en filbane som en streng?
Kommentarer
- I
grep(1)
man-side (skrivman grep
), vil du se “grep [optioner] MØNSTER [FIL …]”. Det faktum, at “FILE” efterfølges af “…” betyder, at der kan være flere filargumenter; det faktum, at den er i firkantede parenteser ([
…]
) betyder, at filargumentet er valgfrit (dvs. der er ikke at være nogen). Fortsæt med at læse, og du vil se “ Grep søger i de navngivne input-FILER (eller standardinput, hvis ingen filer er navngivet eller filnavnet-
er givet) … ” Så hvis der ikke er angivet nogen filer, søger grep i standardindgangen.
Svar
De fleste kommandoer kan håndtere input, der enten er en fil, som de skal åbne for input, eller som en datastrøm, der sendes til kommandoen via STDIN.
Når indholdet af cat file.txt
sendes til en anden kommando gennem et rør (|
) output via STDOUT, som sendes til røret i venstre side, opsættes og føres til kommandoen, som “s på højre side af røret” s STDIN.
Hvis indholdet ikke sendes via STDOUT -> STDIN via et rør, kan kommandoer modtage data ved at åbne filer, der sendes ved navn via kommandolinjeargumenter.
Eksempler
Sender output til STDOUT.
$ cat file 1 2 3 4 5
Output fra cat file
sendes via STDOUT til grep
” s STDIN via røret.
$ cat file | grep 5 5
Behandling af filen som et kommandolinjeargument.
$ grep 5 file 5
Behandler indholdet af filen direkte via STDIN.
$ grep 5 < <(cat file) 5
Her jeg “m, der viser, at indholdet af file
kan dirigeres til grep
via STDIN ovenfor.