Zoeken op website

12 Handige opdrachten voor het filteren van tekst voor effectieve bestandsbewerkingen in Linux


In dit artikel zullen we een aantal opdrachtregelprogramma's bespreken die als filters in Linux fungeren. Een filter is een programma dat standaardinvoer leest, er een bewerking op uitvoert en de resultaten naar standaarduitvoer schrijft.

Om deze reden kan het worden gebruikt om informatie op krachtige manieren te verwerken, zoals het herstructureren van uitvoer om nuttige rapporten te genereren, het wijzigen van tekst in bestanden en vele andere systeembeheertaken.

Dat gezegd hebbende, staan hieronder enkele van de nuttige bestands- of tekstfilters in Linux.

1. Awk-opdracht

Awk is een opmerkelijke taal voor het scannen en verwerken van patronen en kan worden gebruikt om nuttige filters in Linux te bouwen. Je kunt het gaan gebruiken door onze Awk-serie, deel 1 tot en met deel 13, te lezen.

Lees daarnaast ook de awk manpagina voor meer informatie en gebruiksopties:

man awk

2. Sed-commando

sed is een krachtige streameditor voor het filteren en transformeren van tekst. We hebben al twee nuttige artikelen over sed geschreven, die je hier kunt doornemen:

  1. Hoe u de GNU ‘sed’-opdracht gebruikt om bestanden in Linux te maken, bewerken en manipuleren
  2. 15 Handige ‘sed’-opdrachttips en -trucs voor dagelijkse Linux-systeembeheertaken

De sed man-pagina heeft bedieningsopties en instructies toegevoegd:

man sed

3. Grep-, Egrep-, Fgrep-, Rgrep-opdrachten

Deze filtert uitvoerlijnen die overeenkomen met een bepaald patroon. Ze lezen regels uit een bestand of standaardinvoer en printen standaard alle overeenkomende regels naar standaarduitvoer.

Opmerking: het hoofdprogramma is grep, de variaties zijn eenvoudigweg hetzelfde als bij het gebruik van specifieke grep-opties, zoals hieronder (en ze worden nog steeds gebruikt voor achterwaartse compatibiliteit):

egrep = grep -E
fgrep = grep -F
rgrep = grep -r  

Hieronder staan enkele basis grep-opdrachten:

tecmint@TecMint ~ $ grep "aaronkilik" /etc/passwd
aaronkilik:x:1001:1001::/home/aaronkilik:

tecmint@TecMint ~ $ cat /etc/passwd | grep "aronkilik"
aaronkilik:x:1001:1001::/home/aaronkilik:

U kunt meer lezen over Wat is het verschil tussen Grep, Egrep en Fgrep in Linux?.

4. hoofdcommando

head wordt gebruikt om de eerste delen van een bestand weer te geven; standaard worden de eerste 10 regels weergegeven. U kunt de vlag -n num gebruiken om het aantal regels op te geven dat moet worden weergegeven:

tecmint@TecMint ~ $ head /var/log/auth.log  
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
Jan  2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (uid=0)

tecmint@TecMint ~ $ head  -n 5 /var/log/auth.log  
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan  2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan  2 10:51:34 TecMint sudo:  tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan  2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan  2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root

Leer hoe u de hoofdopdrachten met staart- en katopdrachten kunt gebruiken voor effectief gebruik in Linux.

5. staartcommando

tail geeft de laatste delen (standaard 10 regels) van een bestand weer. Gebruik de schakelaar -n num om het aantal regels op te geven dat moet worden weergegeven.

Met de onderstaande opdracht worden de laatste 5 regels van het opgegeven bestand weergegeven:

tecmint@TecMint ~ $ tail -n 5 /var/log/auth.log
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

Bovendien heeft tail een speciale optie -f om wijzigingen in een bestand in realtime te bekijken (vooral logbestanden).

Met de volgende opdracht kunt u wijzigingen in het opgegeven bestand controleren:

tecmint@TecMint ~ $ tail -f /var/log/auth.log
Jan  6 12:58:01 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 12:58:11 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 12:58:12 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 12:58:12 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan  6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

Lees de tail manpagina voor een volledige lijst met gebruiksopties en instructies:

man tail

6. Sorteeropdracht

sort wordt gebruikt om regels uit een tekstbestand of uit standaardinvoer te sorteren.

Hieronder vindt u de inhoud van een bestand met de naam domains.list:

tecmint@TecMint ~ $ cat domains.list
linux-console.net
linux-console.net
news.linux-console.net
news.linux-console.net
linuxsay.com
linuxsay.com
windowsmint.com
windowsmint.com

U kunt een eenvoudige sorteeropdracht uitvoeren om de bestandsinhoud als volgt te sorteren:

tecmint@TecMint ~ $ sort domains.list
linuxsay.com
linuxsay.com
news.linux-console.net
news.linux-console.net
linux-console.net
linux-console.net
windowsmint.com
windowsmint.com

Je kunt de sort-opdracht op veel manieren gebruiken. Bekijk als volgt enkele nuttige artikelen over de sort-opdracht:

  1. 14 Handige voorbeelden van Linux ‘sort’-opdrachten – Deel 1
  2. 7 Interessante Linux ‘sorteer’-opdrachtvoorbeelden – Deel 2
  3. Bestanden zoeken en sorteren op basis van wijzigingsdatum en -tijd
  4. Hoe u de uitvoer van het ‘ls’-commando kunt sorteren op laatst gewijzigde datum en tijd

7. uniq-opdracht

De opdracht uniq wordt gebruikt om herhaalde regels te rapporteren of weg te laten, het filtert regels uit standaardinvoer en schrijft de uitkomst naar standaarduitvoer.

Nadat u sort op een invoerstroom heeft uitgevoerd, kunt u herhaalde regels verwijderen met uniq, zoals in het onderstaande voorbeeld.

Om het aantal keren dat een regel voorkomt aan te geven, gebruikt u de optie -c en negeert u verschillen tussen hoofdletters en kleine letters tijdens het vergelijken door de optie -i op te nemen:

tecmint@TecMint ~ $ cat domains.list
linux-console.net
linux-console.net
news.linux-console.net
news.linux-console.net
linuxsay.com
linuxsay.com
windowsmint.com

tecmint@TecMint ~ $ sort domains.list | uniq -c 
2 linuxsay.com
2 news.linux-console.net
2 linux-console.net
1 windowsmint.com 

Lees de uniq manpagina voor meer gebruiksinformatie en vlaggen:

man uniq

8. fmt-opdracht

fmt eenvoudige optimale tekstformatter, herformatteert alinea's in een gespecificeerd bestand en drukt de resultaten af naar de standaarduitvoer.

Het volgende is de inhoud die is geëxtraheerd uit het bestand domain-list.txt:

1.linux-console.net 2.news.linux-console.net 3.linuxsay.com 4.windowsmint.com

Om de bovenstaande inhoud opnieuw te formatteren naar een standaardlijst, voert u de volgende opdracht uit waarbij de -w-schakelaar wordt gebruikt om de maximale lijnbreedte te definiëren:

tecmint@TecMint ~ $ cat domain-list.txt 
1.linux-console.net 2.news.linux-console.net 3.linuxsay.com 4.windowsmint.com

tecmint@TecMint ~ $ fmt -w 1 domain-list.txt
1.linux-console.net 
2.news.linux-console.net 
3.linuxsay.com 
4.windowsmint.com

9. pr-opdracht

De opdracht pr converteert tekstbestanden of standaardinvoer voor afdrukken. Op Debian systemen kunt u bijvoorbeeld alle geïnstalleerde pakketten als volgt weergeven:

dpkg -l

Om de lijst in pagina's en kolommen te ordenen die klaar zijn om af te drukken, geeft u de volgende opdracht.

tecmint@TecMint ~ $ dpkg -l | pr --columns 3 -l 20  

2017-01-06 13:19                                                  Page 1


Desired=Unknown/Install ii  adduser		ii  apg
| Status=Not/Inst/Conf- ii  adwaita-icon-theme	ii  app-install-data
|/ Err?=(none)/Reinst-r ii  adwaita-icon-theme- ii  apparmor
||/ Name		ii  alsa-base		ii  apt
+++-=================== ii  alsa-utils		ii  apt-clone
ii  accountsservice	ii  anacron		ii  apt-transport-https
ii  acl			ii  apache2		ii  apt-utils
ii  acpi-support	ii  apache2-bin		ii  apt-xapian-index
ii  acpid		ii  apache2-data	ii  aptdaemon
ii  add-apt-key		ii  apache2-utils	ii  aptdaemon-data


2017-01-06 13:19                                                  Page 2


ii  aptitude		ii  avahi-daemon	ii  bind9-host
ii  aptitude-common	ii  avahi-utils		ii  binfmt-support
ii  apturl		ii  aview		ii  binutils
ii  apturl-common	ii  banshee		ii  bison
ii  archdetect-deb	ii  baobab		ii  blt
ii  aspell		ii  base-files		ii  blueberry
ii  aspell-en		ii  base-passwd		ii  bluetooth
ii  at-spi2-core	ii  bash		ii  bluez
ii  attr		ii  bash-completion	ii  bluez-cups
ii  avahi-autoipd	ii  bc			ii  bluez-obexd

.....

De vlaggen die hier worden gebruikt zijn:

  1. --column definieert het aantal kolommen dat in de uitvoer wordt gemaakt.
  2. -l specificeert de paginalengte (standaard is 66 regels).

10. tr-opdracht

Deze tool vertaalt of verwijdert tekens uit standaardinvoer en schrijft resultaten naar standaarduitvoer.

De syntaxis voor het gebruik van tr is als volgt:

tr options set1 set2

Kijk eens naar de onderstaande voorbeelden. In het eerste commando vertegenwoordigt set1( [:upper:] ) het hoofdlettergebruik van invoertekens (allemaal hoofdletters).

Dan vertegenwoordigt set2([:lower:]) het geval waarin de resulterende tekens zullen zijn. Het is hetzelfde in het tweede voorbeeld en de escape-reeks \n betekent afdrukuitvoer op een nieuwe regel:

tecmint@TecMint ~ $ echo "WWW.TECMINT.COM" | tr [:upper:] [:lower:]
linux-console.net

tecmint@TecMint ~ $ echo "news.linux-console.net" | tr [:lower:] [:upper:]
NEWS.TECMINT.COM

11. meer commando

De opdracht meer is een handig filter voor het bekijken van bestanden, dat in principe is gemaakt voor het bekijken van certificaten. Het toont bestandsinhoud in een pagina-achtig formaat, waarbij gebruikers op [Enter] kunnen drukken om meer informatie te bekijken.

Je kunt het gebruiken om grote bestanden als volgt te bekijken:

tecmint@TecMint ~ $ dmesg | more
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
--More--

12. minder commando

less is het tegenovergestelde van de more-opdracht hierboven, maar biedt extra functies en is iets sneller bij grote bestanden.

Gebruik het op dezelfde manier als meer:

tecmint@TecMint ~ $ dmesg | less
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
 4.4.6)
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
[    0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[    0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[    0.000000] x86/fpu: Using 'eager' FPU context switches.
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[    0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
:

Leer waarom ‘minder’ sneller is dan ‘meer’ Commando voor effectieve bestandsnavigatie in Linux.

Dat is alles voor nu. Laat ons weten welke nuttige opdrachtregelhulpmiddelen hier niet worden genoemd en die fungeren als tekstfilters in Linux via het commentaargedeelte hieronder.