Med Linux “ cat ” kommando, hvordan viser jeg bare visse linjer etter nummer
On februar 15, 2021 by admin Hvis jeg bruker cat -n text.txt
for å nummerere linjene automatisk, hvordan bruker jeg kommandoen til å bare vise bestemte nummererte linjer.
Kommentarer
Svar
Bruk sed
Bruk
$ cat file Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10
For å skrive ut en linje (5)
$ sed -n 5p file Line 5
For å skrive ut flere linjer (5 & 8)
$ sed -n -e 5p -e 8p file Line 5 Line 8
For å skrive ut spesifikt område (5-8)
$ sed -n 5,8p file Line 5 Line 6 Line 7 Line 8
For å skrive ut rekkevidde med en annen spesifikk linje (5 – 8 & 10)
$ sed -n -e 5,8p -e 10p file Line 5 Line 6 Line 7 Line 8 Line 10
Svar
En måte å gjøre det på er å bruke sed
:
cat -n text.txt | sed "11d"
der 11 er nummeret på linjen du vil fjerne.
Eller til fjern alle unntatt 11:
cat -n text.txt | sed "11!d"
Områder er også mulige:
cat -n text.txt | sed "9,12!d"
Og cat -n
er ikke engang nødvendig:
sed "9,12!d" text.txt
Svar
Du kan bruke awk rett opp.
awk "NR==1" file.txt
erstatter «1» med ønsket linjenummer.
Kommentarer
- Dette er en million miles det beste svaret her og fortjener mye mer kjærlighet enn det har.
Svar
Avhengig av mål jeg liker hode eller grep
cat /var/log/syslog -n | head -n 50 | tail -n 10
vil du returnere linjene 41 til 50.
eller
cat /var/log/syslog -n | grep " 50" -b10 -a10
viser linjene 40 til 60. Problemet med grep-metoden er at du må du bruke konto for utfylling av linjenumrene (legg merke til mellomrom)
Begge er ganske praktiske for analyse av loggfiler.
Kommentarer
- Ingen av eksemplene trenger
cat
skjønt - vel ja .. … men …. men … ….. Det er bedre måter. Spørsmålet som ble stilt om å bruke katt skjønt, så jeg brukte det.
-
cat
kan ' t gjøre det OP ønsker
Svar
Som andre har vist deg, er det ikke nødvendig å bruke cat -n
. Andre programmer vil gjøre det for deg. Hvis du derimot virkelig trenger å analysere utdataene fra cat -n
og bare vise spesifikke linjer (for eksempel 4-8, 12 og 42), kan du gjøre:
$ cat -n file | awk "$1>=4 && $1<=8 || $1==12 || $1==42" 4 Line 4 5 Line 5 6 Line 6 7 Line 7 8 Line 8 12 Line 12 42 Line 42
I awk
er $1
det første feltet, så denne kommandoen skrives ut alle linjene hvis første felt er i) mellom 4 og 8 (inkludert) eller ii) 12 eller iii) 42.
Hvis du også vil fjerne feltet lagt til av cat -n
for å få de originale linjene fra filen, kan du gjøre:
$ cat -n file | awk "$1>=4 && $1<=8 || $1==12 || $1==42{sub(/^\s*[0-9]+\s*/,""); print}" Line 4 Line 5 Line 6 Line 7 Line 8 Line 12 Line 42
Kommentarer
- Kunne du ikke ' t
NR
i stedet for$1
? - @SolomonUcko sikkert, men siden jeg demonstrerte hvordan jeg gjorde dette ved å bruke
cat -n
spesifikt, tenkte jeg at jeg ville bruke utdataene somcat -n
gir .
Svar
Du kan bruke sed for å vise bare ett tall og l åpne dette med en for loop:
for line in 1 3 7 11; do sed -n ${line}p text.txt; done
tail
+head
kan også gjøre dette, somawk