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/
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' );
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() ) ) );
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() ) ) );
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
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
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
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.
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.
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
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).