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?
Pour imprimer une ligne particulière, vous pouvez utiliser sed
:
_route -n | sed -n 2p
_
pour imprimer la deuxième ligne.
sed
, quel estJe 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 _#
_.
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
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
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