Med Linux “ cat ” kommando, hvordan viser jeg kun visse linjer efter nummer
On februar 15, 2021 by admin Hvis jeg bruger cat -n text.txt
til automatisk nummerering af linjerne, hvordan bruger jeg derefter kommandoen til kun at vise bestemte nummererede linjer.
Kommentarer
Svar
Brug sed
Brug
$ cat file Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10
For at udskrive en linje (5)
$ sed -n 5p file Line 5
For at udskrive flere linjer (5 & 8)
$ sed -n -e 5p -e 8p file Line 5 Line 8
For at udskrive specifikt interval (5-8)
$ sed -n 5,8p file Line 5 Line 6 Line 7 Line 8
For at udskrive rækkevidde med en anden specifik 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åde at gøre det på er ved at bruge sed
:
cat -n text.txt | sed "11d"
hvor 11 er nummeret på den linje, du vil fjerne.
Eller til fjern alle undtagen 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ødvendigt:
sed "9,12!d" text.txt
Svar
Dig kan bruge awk lige op.
awk "NR==1" file.txt
erstatter “1” med det ønskede linjenummer.
Kommentarer
- Dette er en million miles det bedste svar her og fortjener meget mere kærlighed end det har.
Svar
Afhængigt af mål kan jeg lide hoved eller grep
cat /var/log/syslog -n | head -n 50 | tail -n 10
returnerer linier 41 til 50.
eller
cat /var/log/syslog -n | grep " 50" -b10 -a10
viser linjer 40 til 60. Problemet med grep-metoden er, at du skal du bruge konto til polstring af linjenumrene (bemærk mellemrummet)
Begge er ret praktiske til at analysere logfiler.
Kommentarer
- Ingen af eksemplerne har brug for
cat
dog - godt ja .. … men …. men … ….. Der er bedre måder. Spørgsmålet, der blev stillet om at bruge kat, selvom jeg brugte det.
-
cat
kan ' t gøre, hvad OP ønsker
Svar
Som andre har vist dig, er det ikke nødvendigt at bruge cat -n
. Andre programmer vil gøre det for dig. Hvis du dog virkelig har brug for at analysere output fra cat -n
og kun vise specifikke linjer (for eksempel 4-8, 12 og 42), kan du gø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 felt, så denne kommando udskrives alle linjer, hvis første felter er i) mellem 4 og 8 (inklusive) eller ii) 12 eller iii) 42.
Hvis du også vil fjerne det felt, der er tilføjet med cat -n
for at få de originale linjer fra filen kan du gø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 ' ikke bruge
NR
i stedet for$1
? - @SolomonUcko sikkert, men da jeg demonstrerede, hvordan man gør dette ved hjælp af
cat -n
specifikt, troede jeg, at jeg ville bruge det output, somcat -n
giver .
Svar
Du kan bruge sed til kun at vise et nummer og l åb dette med en for loop:
for line in 1 3 7 11; do sed -n ${line}p text.txt; done
tail
+head
kan også gøre dette, ligesomawk