我正在嘗試linux從腳本中的普通 bash 命令獲取我的盒子上的設備串列。我使用了以下方法,但它不起作用。sd*理想情況下,我想將所有nvme設備放入一個陣列中。這是我嘗試過的:
lsblk --nodeps | sed -n '/sd\.*/p'
lsblk --nodeps | sed '/(sd | nv)\.*/p'
lsblk --nodeps | sed -n 's/^([a-z0-9] ?).*/\1/'
lsblk --nodeps | sed -n '/^.*?/p'
lsblk --nodeps | sed '/^(. ?)\s*/p'
lsblk --nodeps | sed '/^(s. ?|n. ?)?)\s*/p'
這是起始語法:
$ lsblk --nodeps
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 119.2G 0 disk
sdb 8:16 1 57.8G 0 disk
nvme0n1 259:0 0 232.9G 0 disk
所以我想對sd*和nvme進行正則運算式,沒有尾隨空格。
任何見解都贊賞我如何將驅動器放入陣列中。
uj5u.com熱心網友回復:
使lsblk輸出更易于決議
lsblk可以被告知禁止標題行,并且只發出您關心的特定資料片段——在這種情況下,是設備名稱。
如果您有一個只有設備名稱的串列,這grep是最簡單的決議它們的工具;但是添加一個額外的規則(在這種情況下,丟棄磁區)awk開始發揮作用。
因此:
readarray -t disks < <(lsblk -dnr --output NAME | grep '^(sd|nvme)')
過濾/dev/disk/by-id自己
對于固執的人,表明它可以做到:
shopt -s nullglob extglob
declare -A results=( )
devices=( /dev/disk/by-id/!(*-part*) )
for device in "${devices[@]}"; do
target=$(readlink -f "$device")
results[${target#/dev/}]=1
done
disks=( "${!results[@]}" )
declare -p disks # print the resulting array
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496503.html
