2017-09-18 2 views
0

Je dois détecter automatiquement tous les lecteurs USB branchés, montés ou non, monter ceux qui ne sont pas déjà montés dans des dossiers portant le nom du nom donné de l'appareil (comme cela arrive dans une machine Windows par défaut) et obtenir les routes des points de montage de tous les périphériques. Les périphériques doivent être montés dans des dossiers dans/media/pi (en utilisant un Raspberry Pi, donc pi est mon nom d'utilisateur). Voilà ce que je fais:Comment extraire les chemins complets de la sortie grep en utilisant l'expression régulière

Pour obtenir le chemin de tous les périphériques Mounter:

1) Exécuter lsblk, sorties:

NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 
sda   8:0 1 14.4G 0 disk 
└─sda1  8:1 1 14.4G 0 part /media/pi/D0B46928B4691270 
sdb   8:16 1 14.3G 0 disk 
└─sdb1  8:17 1 14.3G 0 part /media/pi/MI PENDRIVE 
mmcblk0  179:0 0 14.9G 0 disk 
├─mmcblk0p1 179:1 0 41.8M 0 part /boot 
└─mmcblk0p2 179:2 0 14.8G 0 part/

2) Avec une ligne particulièrement conçu, je peux filtrer certaines informations inutiles:

Je lance lsblk | grep 'sd' | grep 'media' qui délivre en sortie:

└─sda1  8:1 1 14.4G 0 part /media/pi/D0B46928B4691270 
└─sdb1  8:17 1 14.3G 0 part /media/pi/MI PENDRIVE 

Je dois obtenir /media/pi/D0B46928B4691270 et /media/pi/MI PENDRIVE, de préférence dans un tableau. Actuellement, je fais ceci:

lsblk | grep 'sd' | grep 'media' | cut -d '/' -f 4 

Mais il fonctionne uniquement avec des chemins qui ne disposent pas des espaces et la sortie de grep est pas un tableau bien sûr. Quelle serait une manière propre de le faire avec des expressions régulières?

Merci.

Répondre

0

Quelque chose comme ça?

$ echo "$f" 
NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 
sda   8:0 1 14.4G 0 disk 
└─sda1  8:1 1 14.4G 0 part /media/pi/D0B46928B4691270 
sdb   8:16 1 14.3G 0 disk 
└─sdb1  8:17 1 14.3G 0 part /media/pi/MI PENDRIVE 
mmcblk0  179:0 0 14.9G 0 disk 
├─mmcblk0p1 179:1 0 41.8M 0 part /boot 
└─mmcblk0p2 179:2 0 14.8G 0 part/

$ grep -o '/media/.*$' <<<"$f" 
/media/pi/D0B46928B4691270 
/media/pi/MI PENDRIVE 

$ IFS=$'\n' drives=($(grep -o '/media/.*$' <<<"$f")) 

$ printf '%s\n' "${drives[@]}" 
/media/pi/D0B46928B4691270 
/media/pi/MI PENDRIVE 
+0

Tout d'abord, que fait écho" $ f "? Je vois que dans votre terminal il fait la même chose que lsblk mais je ne sais pas pourquoi ou comment c'est arrivé. Deuxièmement, j'ai lancé lsblk | grep -o '/media/.*$' <<< "$ f" et n'a aucune sortie. Mais je vois que vous obtenez le résultat dont j'ai besoin, chacun des chemins dans une ligne différente et isolé de tout le reste. Comment mettriez-vous cela dans un script? Merci! – user3290570

+0

il a mis votre texte dans une variable et l'a utilisé dans la commande grep. mais je ne sais pas pourquoi utiliser '<<<' et pourquoi juste < Mohamed

+0

@ user3290570 Dans mon système 'lsblk' produit une sortie complètement différente, ainsi j'ai assigné votre sortie lsblk dans une variable' f' être capable de faire un test avec des résultats similaires à votre système. Dans votre cas, vous devez juste lancer 'lsblk | grep -o '/ media /.*$' 'ou pour mettre les résultats dans un tableau il suffit de lancer' IFS = $ '\ n' lecteurs = ($ (lsblk | grep -o '/ media /.* $ ')) ' –

1

lsblk prend en charge la sortie json avec le fanion -J. Je recommande que si vous voulez analyser la sortie:

lsblk -J | jq '..|.?|select(.name|startswith("sd")).mountpoint // empty' 
+0

Intéressant. Il suffit de cocher une case SuSE Leap 42.2, pas d'option '-J', mais sur Arch, c'est là. Bon à savoir. –

+0

Exécution de cette ligne dans un terminal dans mes sorties RPi "jq: commande introuvable" – user3290570

+0

@ user3290570 il suffit de l'installer. 'apt-get install jq' – hek2mgl