2017-09-18 1 views
0

플러그가 꽂혀 있거나 마운트되어 있지 않거나 마운트되지 않은 USB 드라이브를 자동으로 감지해야합니다. 예를 들어 장치의 이름이 지정된 폴더에 이미 마운트되지 않은 드라이브를 마운트해야합니다 기본적으로 Windows 컴퓨터에서 발생 함) 모든 장치의 탑재 지점 경로를 가져옵니다. 장치는/media/pi 폴더에 마운트해야합니다 (예 : pi는 내 사용자 이름 임).정규 표현식을 사용하여 grep 출력에서 ​​전체 경로를 추출하는 방법

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을 가져와야하며, 배열로 구성해야합니다. 현재 나는이 일을하고있다 :

그러나 공백이없는 경로에서만 작동하며 grep의 출력은 물론 배열이 아니다. 정규 표현식으로 이것을 수행하는 명확한 방법은 무엇입니까?

감사합니다.

답변

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 
+0

우선 echo "$ f"는 무엇을합니까? 나는 당신의 터미널에서 lsblk와 똑같은 것을 보았습니다. 그러나 나는 그것이 왜 일어 났는지 알지 못합니다. 둘째, 나는 lsblk | grep -o '/media/.*$'<<< "$ f"그리고 출력이 전혀 없습니다. 그러나 나는 당신이 필요한 결과를 얻는 것을 봅니다. 각각의 경로는 다른 라인에 있고 다른 모든 것들과 격리되어 있습니다. 어떻게 그걸 대본에 넣으시겠습니까? 감사합니다. – user3290570

+0

그는 텍스트를 변수에 넣고 grep 명령에 사용했습니다. 하지만 왜'<<<'를 사용하고 왜'<'가 왜 작동하지 않는지 모르겠다. – Mohamed

+0

@ user3290570 내 시스템에서'lsblk'는 완전하게 다른 출력을 만들어 내며, 그래서 당신의 lsblk 출력을 변수'f' 시스템과 유사한 결과로 테스트를 수행 할 수 있습니다. 귀하의 경우에는'lsblk | grep -o '/ media /.*$''또는 결과를 배열에 넣으려면'IFS = $ '\ n'drives = ($ (lsblk | grep -o '/ media /.* $ '))' –

1

lsblk-J 플래그로 json 출력을 지원합니다. 출력을 파싱하려면 다음을 권합니다.

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

흥미 롭습니다. SuSE Leap 42.2 상자를 체크했는데'-J' 옵션은 없었지만, 아치에는 거기에 있습니다. 알아 둘만한. –

+0

RPi 출력의 터미널에서 해당 행을 실행하면 "jq : command not found"가 표시됩니다. – user3290570

+0

@ user3290570 그냥 설치하십시오. 'apt-get install jq' – hek2mgl

관련 문제