web-dev-qa-db-fra.com

Utiliser grep, awk, etc. pour filtrer le résultat de la commande

Je vais utiliser route comme exemple.

route -n

Ce qui précède fournit des informations de routage. La rangée du haut est votre connexion active. Je peux manipuler la sortie uniquement dans la deuxième colonne en faisant:

route -n | awk '{print $2}'

Maintenant, comment puis-je filtrer par ligne?

3
Brian Graham

Pour imprimer une ligne particulière, vous pouvez utiliser sed:

_route -n | sed -n 2p
_

pour imprimer la deuxième ligne.

sed, quel est

Je vais donner une explication brève et incomplète de ce qui est sed. Pour une description complète, je suggère de consulter les pages sed info (exécutez _info sed_).

sed mean s flux ed itor , c’est-à-dire un éditeur qui peut agir sur un flux (ou un tuyau) de données textuelles, bien qu'il puisse également agir sur des fichiers; cela signifie essentiellement que (contrairement à ed), il ne peut jamais revenir à une ligne précédente.

sed, comme awk lit une ligne à la fois et applique un script à cette ligne pour éventuellement la modifier. A la fin du script, par défaut, la ligne modifiée est sortie sur stdout. Ensuite, sed passe à la ligne suivante.

Un script est une séquence de paires adresse-commande, si la ligne correspond à l'adresse, la commande est exécutée.

L’utilisation typique de sed consiste à remplacer un motif par quelque chose, par ex.

_command | sed 's/ *$//'
_

ici, la chaîne entre guillemets simples est le script, composé d'une seule paire adresse-commande. L'adresse est manquante (elle apparaîtrait avant le s), dans ce cas, la commande est appliquée par défaut à toutes les lignes d'entrée. s est la commande et le reste de la chaîne sont des instructions spécifiques à la commande, indiquant "substituez 0 occurrence ou plus (_*_) d'un caractère espace () à la fin de la ligne (_$_) sans rien (c'est à dire les enlever) ".

Les autres commandes utiles sont p et d. La commande p imprime la ligne actuelle. Cette option est utile en combinaison avec l'option _-n_, qui modifie le comportement par défaut pour imprimer la ligne actuelle à la fin du script. Donc dans

_sed -n '2p'
_

le script est la chaîne _2p_ composée de l'adresse _2_ et de la commande p, de sorte que la ligne 2 sera imprimée; toutes les autres lignes ne seront pas imprimées à cause du _-n_ option.

La commande d supprime une ligne, par exemple

_    sed '3,6d'
_

supprimerait toutes les lignes de la troisième à la sixième. _3,6_ est une plage d'adresses. Je remarque que dans ce cas, il ne faut pas utiliser l'option _-n_, car nous voulons imprimer toutes les autres lignes.

Dernière chose, une adresse pourrait être un motif, comme dans

_sed -n '/^#/p'
_

cette commande imprimera toutes les lignes commençant (_^_) avec un caractère _#_.

3
enzotib

Vous pouvez filtrer IN sur une ligne en allant dans grep et en recherchant une ligne commençant par votre adresse IP d’intérêt. Par exemple, si vous souhaitez afficher la ligne correspondant à 192.168.1.1, vous devez:

$ route | grep ^192.168.1.0
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0

La marque '^' signifie "line-starts-with". Vous pouvez donc être plus générique avec:

$ route | grep ^192.168.1
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0
192.168.111.0   *               255.255.255.0   U     0      0        0 virbr0
1
kyleN

Vous pouvez utiliser une expression régulière pour indiquer à awk quelles lignes vous souhaitez, par exemple.

route -n | awk '/^192.168/ {print $2}'

affichera la colonne secondes de toutes les lignes commençant par 192.168

1
Florian Diesch

une réponse awk pourrait aussi ressembler à quelque chose comme:

$0 ~ ( /matchthis/ ) { print $2 }

0 $ se réfère simplement à toute la ligne/ligne

sed et awk peuvent être une combinaison très puissante

les expressions régulières valent la peine d'être maîtrisées

0
Manse Jennings