如何对比命令输出与本地文本文件,找出未匹配条目
找出文本文件中未在命令输出出现的单词
我来帮你搞定这个需求!要识别文本文件里那些没在命令输出中出现的单词,这里有两种实用的shell方法,完全适配你的场景:
先明确你的输入内容
命令输出(执行
./factory.sh listapplications | grep -i running得到):
'ftp' '1' (7 objects + dependencies), STATUS: 'RUNNING' - 'XSD Da 'abc' '5.1.0' (14 objects + dependencies), STATUS: 'RUNNING' - '2017-10-13: Fix fuer Bug 2150' 'name' '1.0.2' (5 objects + dependencies), STATUS: 'RUNNING'
文本文件(假设命名为check_list.txt)内容:
ftp abc name missing alsomissing
方法一:用grep+进程替换快速实现
这是最简洁的写法,利用grep的反向匹配和进程替换一步完成:
grep -vxFf <(./factory.sh listapplications | grep -i running | tr -s "'" " " | tr -s "[:punct:][:space:]" "\n" | sort -u) check_list.txt
逐部分解释:
<(...):把括号内的命令输出当作临时文件供grep调用tr -s "'" " ":把单引号替换成空格,拆分被引号包裹的目标单词(比如'ftp'变成ftp)tr -s "[:punct:][:space:]" "\n":把所有标点符号和空格换成换行符,让每个单词单独占一行sort -u:去除重复的单词,避免无效的重复匹配grep -vxFf:-f指定用临时文件内容作为匹配规则,-x确保只匹配完整单词,-v输出不匹配的行(也就是文本中没在命令输出出现的单词)
方法二:用awk脚本更灵活可控
如果后续需要调整匹配逻辑,awk脚本的可读性和扩展性会更强:
./factory.sh listapplications | grep -i running | awk ' BEGIN { # 先读取检查列表文件,把每个单词存入数组,标记为"未出现"(值为1) while ((getline line < "check_list.txt") > 0) { split(line, words, /[[:space:]]+/) for (w in words) { check[words[w]] = 1 } } } # 处理命令输出的每一行 { gsub(/'\''/, " ") # 把单引号替换成空格,方便拆分单词 split($0, tokens, /[[:punct:][:space:]]+/) # 按标点和空格拆分所有内容为单词 for (t in tokens) { # 如果当前单词在检查列表里,标记为"已出现"(值为0) if (tokens[t] in check) { check[tokens[t]] = 0 } } } END { # 遍历数组,输出所有标记为"未出现"的单词 for (word in check) { if (check[word] == 1) { print word } } }'
最终输出结果
两种方法执行后,都会输出文本文件里未在命令输出中出现的单词:
missing alsomissing
内容的提问来源于stack exchange,提问作者CanLo
相关产品推荐
相关产品推荐

