Unix下如何读取df输出的指定Filesystem列(解决列合并问题)
解决df命令输出中Filesystem列的提取与分割问题
我明白你的困扰——df -k DELETEME的输出里,因为State列是空值,导致用默认空格分割的awk命令会把Filesystem列直接当成第一列,而你需要从这列的$ZPMON.DELETEMESTARTED里提取出DELETEME部分。下面给你几个实用的解决办法:
方法一:先提取Filesystem列,再匹配目标字符串
首先直接提取数据行的第一列(也就是Filesystem列,因为State列无值导致列偏移),再用正则匹配提取DELETEME:
df -k DELETEME | tail -1 | awk '{match($1, /DELETEME/); print substr($1, RSTART, RLENGTH)}'
解释:
match($1, /DELETEME/):在第一列内容里定位DELETEME的位置substr($1, RSTART, RLENGTH):根据定位到的起止位置,提取目标字符串
方法二:基于数字位置定位Filesystem列(更鲁棒)
如果担心State列偶尔有值导致列位置变化,可以通过识别第一个数字的位置,提取开头到该位置的内容作为Filesystem列,再提取目标字符串:
df -k DELETEME | tail -1 | sed 's/^\([^0-9]*\)[0-9].*/\1/; s/ *$//; s/.*\(DELETEME\).*/\1/'
解释:
s/^\([^0-9]*\)[0-9].*/\1/:提取开头到第一个数字前的所有内容(即Filesystem列,可能带末尾空格)s/ *$//:去掉末尾多余的空格s/.*\(DELETEME\).*/\1/:从清理后的Filesystem内容里提取DELETEME
方法三:一步到位的awk命令
用awk完成所有操作,逻辑更清晰:
df -k DELETEME | tail -1 | awk '{ # 提取开头到第一个数字前的内容作为Filesystem列 match($0, /^[^0-9]+/); fs = substr($0, RSTART, RLENGTH); # 去掉末尾空格 gsub(/ +$/, "", fs); # 提取DELETEME match(fs, /DELETEME/); print substr(fs, RSTART, RLENGTH); }'
这些方法都能准确帮你提取到需要的DELETEME部分,你可以根据自己的习惯选择使用。
内容的提问来源于stack exchange,提问作者Manjusha Yenakandla
相关产品推荐
相关产品推荐

