如何使用正则表达式从grep输出中提取完整路径

时间:2017-09-18 22:02:36

标签: regex bash shell expression

我需要自动检测插入,安装或未插入的任何USB驱动器,将未安装的USB驱动器安装在具有设备名称名称的文件夹中(默认情况下,它发生在Windows机器中)并获取所有设备的挂载点的路由。设备应安装在/ media / pi文件夹中(使用Raspberry Pi,因此pi是我的用户名)。这就是我正在做的事情:

获取所有贴片机设备的路径:

1)运行lsblk,输出:

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)通过特制的线条,我可以过滤掉一些不必要的信息:

我运行lsblk | grep 'sd' | grep 'media'输出:

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

我需要获得/media/pi/D0B46928B4691270/media/pi/MI PENDRIVE,最好是在数组中。目前我正在这样做:

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

但它只适用于没有空格的路径,而grep的输出当然不是数组。用正则表达式做这个的干净方法是什么?

感谢。

2 个答案:

答案 0 :(得分:2)

lsblk支持带有-J标志的json输出。我建议如果你想解析输出:

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

答案 1 :(得分:0)

这样的东西?

$ 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