Med Linux “ cat ”, hur visar jag bara vissa rader efter nummer
On februari 15, 2021 by admin Om jag använder cat -n text.txt
för att automatiskt numrera raderna, hur använder jag sedan kommandot för att bara visa vissa numrerade rader.
Kommentarer
Svar
Använd sed
Användning
$ cat file Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10
Att skriva ut en rad (5)
$ sed -n 5p file Line 5
Att skriva ut flera rader (5 & 8)
$ sed -n -e 5p -e 8p file Line 5 Line 8
För att skriva ut specifikt intervall (5-8)
$ sed -n 5,8p file Line 5 Line 6 Line 7 Line 8
För att skriva ut intervall med annan specifik rad (5 – 8 & 10)
$ sed -n -e 5,8p -e 10p file Line 5 Line 6 Line 7 Line 8 Line 10
Svar
Ett sätt att göra det är att använda sed
:
cat -n text.txt | sed "11d"
där 11 är numret på raden du vill ta bort.
Eller till ta bort alla utom 11:
cat -n text.txt | sed "11!d"
Områden är också möjliga:
cat -n text.txt | sed "9,12!d"
Och cat -n
behövs inte ens:
sed "9,12!d" text.txt
Svar
Du kan använda awk rakt upp.
awk "NR==1" file.txt
ersätter ”1” med önskat radnummer.
Kommentarer
Svar
Beroende på mål som jag gillar head eller grep
cat /var/log/syslog -n | head -n 50 | tail -n 10
returneras rader 41 till 50.
eller
cat /var/log/syslog -n | grep " 50" -b10 -a10
visar rader 40 till 60. Problemet med grep-metoden är att du måste använda konto för utfyllnad av linjenumren (märk utrymmet)
Båda är ganska praktiska för att analysera loggfiler.
Kommentarer
- Inget av exemplen behöver
cat
men - ja ja .. … men …. men … ….. Det finns bättre sätt. Frågan som ställdes om att använda katt ändå, så jag använde den.
-
cat
kan ' t göra vad OP vill ha
Svar
Som andra har visat dig behöver du inte använda cat -n
. Andra program gör det åt dig. Om du emellertid verkligen behöver analysera utdata från cat -n
och bara visa specifika rader (till exempel 4-8, 12 och 42), kan du göra:
$ 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
är $1
det första fältet, så det här kommandot skrivs ut alla rader vars första fält är i) mellan 4 och 8 (inklusive) eller ii) 12 eller iii) 42.
Om du också vill ta bort fältet som läggs till av cat -n
för att hämta originalraderna från filen kan du göra:
$ 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
- Kunde ' inte använda
NR
istället för$1
? - @SolomonUcko säkert, men eftersom jag visade hur jag gjorde detta med
cat -n
specifikt, trodde jag att jag skulle använda den utdata somcat -n
ger .
Svar
Du kan använda sed för att bara visa ett nummer och l öppna detta med en for loop:
for line in 1 3 7 11; do sed -n ${line}p text.txt; done
tail
+head
kan också göra detta, liksomawk