问题描述
LInes = $(对于{scsi,sat,ata,nvme}中的i;执行smartctl --scan -d $ i;完成 |排序uniq | grep -v'^#| / dev / sd'| awk'{print $ 2,$ 3,$ 5}'| sed 's /, \ r $ //');而IFS =读取-r行;做smartctl -i $ line;完成
提供以下输出:
SEAGATE
ST2000NX0273
2,000,398,934,016 bytes [2.00 TB]
SEAGATE
ST2000NX0273
2,016 bytes [2.00 TB]
INTEL SSDSC2KB240G7
240,057,409,536 bytes [240 GB]
INTEL SSDPE2KX020T7
2,016 [2.00 TB]
INTEL SSDPE2KX020T7
2,016 [2.00 TB]
我希望将每个HDD信息放入自己的行中,同时解析Capability以显示其人类可读格式。如果capacitt仍然有[括号]也可以。所需的输出:
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
INTEL SSDSC2KB240G7 240 GB
INTEL SSDPE2KX020T7 2.00 TB
INTEL SSDPE2KX020T7 2.00 TB
解决方法
您能否仅在GNU awk
中尝试使用所示示例进行跟踪,编写和测试。
awk -v RS= -v FS="\n" '
{
while($0){
match($0,/[^]]*/)
val=""
val=substr($0,RSTART,RLENGTH)
gsub(/\n[[:space:]]+|\n/," ",val)
sub(/^ +/,"",val)
num=split(val,arr," |\\[")
print arr[1],arr[2],arr[num-1],arr[num]
$0=substr($0,RSTART+RLENGTH+1)
}
}' Input_file
说明: 添加以上详细说明。
awk -v RS= -v FS="\n" ' ##Starting awk program from here and setting field separator as new line and RS as null.
{
while($0){ ##Running while loop till line exists.
match($0,/[^]]*/) ##Using match function to match everything till ] here.
val="" ##Nullifying variable val here.
val=substr($0,RLENGTH) ##Creating val which has sub-string from RSTART to till RLENGTH value.
gsub(/\n[[:space:]]+|\n/,val) ##Globally substituting either newline spaces OR only new lines with space in val.
sub(/^ +/,val) ##Substituting starting spaces with NULL in val here.
num=split(val," |\\[") ##Splitting val value into arr with deliminator of space and [ for all values.
print arr[1],arr[num] ##printing 1st,2nd and 2nd last and last value of arr here.
$0=substr($0,RSTART+RLENGTH+1) ##Re-creating value of current line which has REST of the line leaving part which was matched above,to skip already matched part and avoid duplicates.
}
}' Input_file ##Mentioning Input_file name here.
如果您通过获取其他命令来运行此命令,然后将其像your_command | awk...
一样传递给它们,则可以从上方删除Input_file。
awk -v RS=[][] '{ORS=(NR%2? " ": "\n"); print $1,$2}' file
使用您的输入进行测试:
> cat file
SEAGATE
ST2000NX0273
2,000,398,934,016 bytes [2.00 TB]
SEAGATE
ST2000NX0273
2,016 bytes [2.00 TB]
INTEL SSDSC2KB240G7
240,057,409,536 bytes [240 GB]
INTEL SSDPE2KX020T7
2,016 [2.00 TB]
INTEL SSDPE2KX020T7
2,016 [2.00 TB]
输出:
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
INTEL SSDSC2KB240G7 240 GB
INTEL SSDPE2KX020T7 2.00 TB
INTEL SSDPE2KX020T7 2.00 TB
此外,这里的初始方法是]
是每条“记录”的结尾,就像这样:
awk -v RS=] '{gsub("\\[",""); print $1,$2,$(NF-1),$NF}' file
,
在每个Unix机器的任何shell中使用任何awk:
$ cat tst.awk
gsub(/.*[[]|[]]/,"") {
$0 = prev FS $0
$1 = $1
print
prev = ""
next
}
{ prev = prev FS $0 }
。
$ awk -f tst.awk file
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
SEAGATE ST2000NX0273 2.00 TB
INTEL SSDSC2KB240G7 240 GB
INTEL SSDPE2KX020T7 2.00 TB
INTEL SSDPE2KX020T7 2.00 TB