Met het Linux “ cat ” commando, hoe kan ik alleen bepaalde regels weergeven op nummer
Geplaatst op februari 15, 2021 door admin Als ik cat -n text.txt
gebruik om de regels automatisch te nummeren, hoe gebruik ik dan het commando om alleen bepaalde genummerde regels weer te geven.
Opmerkingen
Antwoord
Gebruik sed
Gebruik
$ cat file Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Line 9 Line 10
Om één regel (5) af te drukken
$ sed -n 5p file Line 5
Om meerdere regels af te drukken (5 & 8)
$ sed -n -e 5p -e 8p file Line 5 Line 8
Om een specifiek bereik af te drukken (5 – 8)
$ sed -n 5,8p file Line 5 Line 6 Line 7 Line 8
Om een bereik af te drukken met een andere specifieke regel (5 – 8 & 10)
$ sed -n -e 5,8p -e 10p file Line 5 Line 6 Line 7 Line 8 Line 10
Answer
Een manier om dit te doen is door sed
te gebruiken:
cat -n text.txt | sed "11d"
waarbij 11 het nummer is van de regel die u wilt verwijderen.
Of naar verwijder alles behalve 11:
cat -n text.txt | sed "11!d"
Bereiken zijn ook mogelijk:
cat -n text.txt | sed "9,12!d"
En cat -n
is zelfs niet nodig:
sed "9,12!d" text.txt
Antwoord
Jij kan awk gewoon gebruiken.
awk "NR==1" file.txt
vervang “1” door het gewenste regelnummer.
Opmerkingen
- Dit is met een miljoen mijl het beste antwoord hier en verdient veel meer liefde dan het heeft.
Antwoord
Afhankelijk van de doelen hou ik van head of grep
cat /var/log/syslog -n | head -n 50 | tail -n 10
retourneert regel 41 tot en met 50.
of
cat /var/log/syslog -n | grep " 50" -b10 -a10
zal regel 40 tot en met 60 tonen. Het probleem met de grep-methode is dat u account moeten gebruiken voor het opvullen van de regelnummers (let op de spatie)
Beide zijn erg handig voor het ontleden van logbestanden.
Reacties
- Geen van beide voorbeelden heeft
cat
nodig - nou ja .. . maar …. maar … ….. Er zijn betere manieren. De vraag werd echter gesteld over het gebruik van cat, dus ik heb het gebruikt.
-
cat
kan ' niet doen wat het OP wil
Antwoord
Zoals anderen je hebben laten zien, is het niet nodig om . Andere programmas zullen het voor je doen. Als je echter echt de uitvoer van cat -n
moet parseren en alleen specifieke regels moet weergeven (bijvoorbeeld 4-8, 12 en 42), kun je het volgende doen:
$ 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
In awk
is $1
het eerste veld, dus deze opdracht wordt afgedrukt alle regels waarvan de eerste velden i) tussen 4 en 8 (inclusief) of ii) 12 of iii) 42 zijn.
Als u ook het veld wilt verwijderen dat is toegevoegd door cat -n
om de originele regels uit het bestand te halen, kunt u het volgende doen:
$ 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
Opmerkingen
- Kunt u ' niet
NR
gebruiken in plaats van$1
? - @SolomonUcko zeker, maar aangezien ik demonstreerde hoe dit te doen met specifiek
cat -n
, dacht ik dat ik de uitvoer zou gebruiken diecat -n
biedt .
Answer
Je kunt sed gebruiken om slechts één cijfer te tonen en l oop dit met een for-lus:
for line in 1 3 7 11; do sed -n ${line}p text.txt; done
tail
+head
kan dit ook doen, net alsawk