Tips en Trucs 2019

Zoeken met grep

Grep (global regular expression print) doorzoekt bestanden regel per regel op tekstfragmenten.

Om de werking van grep duidelijk te maken gebruiken we de WordPress broncode, die je met de volgende opdracht kunt downloaden:

dany@pindabook:~> wget https://nl-be.wordpress.org/latest-nl_BE.tar.gz
--2019-04-06 15:57:13--  https://nl-be.wordpress.org/latest-nl_BE.tar.gz
Herleiden van nl-be.wordpress.org (nl-be.wordpress.org)... 198.143.164.252
Verbinding maken met nl-be.wordpress.org (nl-be.wordpress.org)|198.143.164.252|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 11219490 (11M) [application/octet-stream]
Wordt opgeslagen als: ‘latest-nl_BE.tar.gz’

latest-nl_BE.tar.gz               100%[==========================================================>]  10,70M  2,91MB/s    in 3,7s    

2019-04-06 15:57:18 (2,91 MB/s) - '‘latest-nl_BE.tar.gz’' opgeslagen [11219490/11219490]

En uitpakken met:

dany@pindabook:~> tar -xzf latest-nl_BE.tar.gz

Waarna je de uitgepakte Wordpress map kunt openen met:

dany@pindabook:~> cd wordpress/

Een specifiek bestand doorzoeken

We zoeken in het bestand wp-config-sample.php naar de regel met het woord DB_USER:

dany@pindabook:~/wordpress> grep 'DB_USER' wp-config-sample.php
define( 'DB_USER', 'username_here' );

Verschillende bestanden doorzoeken

We zoeken in de map wp-admin in alle bestanden die beginnen met admin en eindigen op .php naar regels die str_replace bevatten:

dany@pindabook:~/wordpress> grep 'str_replace' wp-admin/admin*.php
wp-admin/admin-ajax.php:    add_action( 'wp_ajax_' . $_GET['action'], 'wp_ajax_' . str_replace( '-', '_', $_GET['action'] ), 1 );
wp-admin/admin-ajax.php:    add_action( 'wp_ajax_' . $_POST['action'], 'wp_ajax_' . str_replace( '-', '_', $_POST['action'] ), 1 );
wp-admin/admin-header.php:$admin_body_class .= ' branch-' . str_replace( array( '.', ',' ), '-', floatval( get_bloginfo( 'version' ) ) );
wp-admin/admin-header.php:$admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', get_bloginfo( 'version' ) ) );
wp-admin/admin-header.php:$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );

Met regelnummers

Als je de bestanden later wil bewerken met een teksteditor is het handig om te weten op welke regel het tekstfragment werd gevonden (optie -n, --line-number):

dany@pindabook:~/wordpress> grep 'str_replace' wp-admin/admin*.php -n
wp-admin/admin-ajax.php:142:  add_action( 'wp_ajax_' . $_GET['action'], 'wp_ajax_' . str_replace( '-', '_', $_GET['action'] ), 1 );
wp-admin/admin-ajax.php:146:  add_action( 'wp_ajax_' . $_POST['action'], 'wp_ajax_' . str_replace( '-', '_', $_POST['action'] ), 1 );
wp-admin/admin-header.php:170:$admin_body_class .= ' branch-' . str_replace( array( '.', ',' ), '-', floatval( get_bloginfo( 'version' ) ) );
wp-admin/admin-header.php:171:$admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', get_bloginfo( 'version' ) ) );
wp-admin/admin-header.php:173:$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );

Alle bestanden recursief in mappen doorzoeken

Om alle bestanden, ook deze in eventuele submappen te doorzoeken, moet je recursief zoeken (optie -r, --recursive). Daarenboven wordt in het voorbeeld hieronder niet gelet op hoofd- of kleine letters (optie -i, --ignore-case) en worden alleen de bestandnamen waarin de zoekterm voorkwam weergegeven (optie -l, --files-with-matches):

dany@pindabook:~/wordpress> grep 'DB_USER' -ril
wp-admin/setup-config.php
wp-includes/load.php
wp-config-sample.php

Zoeken naar bestanden in een bepaalde map

Grep opdrachten worden dikwijls in combinatie met andere opdrachten uitgevoerd, in het voorbeeld met de find opdracht die bepaald welke bestanden met grep doorzocht worden:

dany@pindabook:~/wordpress> find wp-admin/ -name '*.php' -exec grep -l 'eval' {} \;
wp-admin/edit-tag-form.php
wp-admin/includes/class-wp-automatic-updater.php
wp-admin/includes/media.php
wp-admin/includes/ajax-actions.php
wp-admin/includes/class-wp-upgrader.php
wp-admin/includes/update-core.php
wp-admin/includes/class-wp-posts-list-table.php
wp-admin/includes/class-pclzip.php
wp-admin/includes/image.php
wp-admin/user-edit.php

Zoeken naar processen

Zoek naar alle onderdelen die websites aanbiedt (http dienst apache):

dany@pindabook:~/wordpress> ps aux | grep httpd
root      1467  0.0  0.4 303944 32596 ?        Ss   14:40   0:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
dany      1591  0.0  0.1 303944 11956 ?        S    14:40   0:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
dany      1593  0.0  0.1 303944 11956 ?        S    14:40   0:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
dany      1594  0.0  0.1 303944 11956 ?        S    14:40   0:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
dany      1595  0.0  0.1 303944 11956 ?        S    14:40   0:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
dany      1596  0.0  0.1 303944 11956 ?        S    14:40   0:00 /usr/sbin/httpd-prefork -DSYSCONFIG -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
dany      4290  0.0  0.0   8688   900 pts/0    S+   16:53   0:00 grep --color=auto httpd --color=always

Zoek uit welke sockets tot een proces met een bepaald ID behoren

Welke sockets worden door proces 1596 (http proces) gebruikt?

dany@pindabook:~/wordpress> sudo lsof -p 1596 | grep -Ei 'cwd|unix|sock'
[sudo] wachtwoord voor root:
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
httpd-pre 1596 dany  cwd       DIR                8,4     4096       2 /
httpd-pre 1596 dany  mem       REG                8,4    97488 1211756 /usr/lib64/php7/extensions/sockets.so
httpd-pre 1596 dany    1u     unix 0xffff880210cf3000      0t0   26673 type=STREAM
httpd-pre 1596 dany    3u     sock                0,9      0t0   25330 protocol: TCP

De -E, --extended-regexp optie zorgt dat de zoekterm uitgebreide reguliere expressies mag bevatten. Zo zoekt grep in het voorbeeld naar regels die ofwel cwd of unix of sock bevatten.

Tel het aantal http verbindingen

Met de volgende opdracht kom je te weten hoeveel verbindingen uw HTTP Apache server voor het ogenblik verzorgt:

dany@pindabook:~/wordpress> ss -an | grep :80 | wc -l
1

De ss opdracht geeft alle verbindingen door aan grep die enkel de regels (verbindingen) doorlaat waarin poort :80 (http) voorkomt. De door grep gefilterde regels worden door de opdracht wc geteld en weergegeven.

Opruimen

Opgeruimd staat netjes, de in de voorbeelden gebruikte bestanden en mappen verwijder je met de volgende opdrachten:

dany@pindabook:~/wordpress> cd ..
dany@pindabook:~> rm -r wordpress/
dany@pindabook:~> rm latest-nl_BE.tar.gz

Help

Meer informatie over de gebruikte opdrachten kan je steeds opvragen met de -h, --help optie of via de man opdracht voor de uitgebreidere handleidingen (manpage).

grep