Shell如何检查文件中的一行中是不是存在模式
Posted
技术标签:
【中文标题】Shell如何检查文件中的一行中是不是存在模式【英文标题】:Shell How to check if a pattern exists in a line in fileShell如何检查文件中的一行中是否存在模式 【发布时间】:2015-12-20 14:07:56 【问题描述】:我们如何检查文件中特定行号的行中是否存在模式或字符串:
一个文件在第 28 行有以下行:
page.sysauth = “管理员”
我需要检查此特定行是否存在“Admin”(它可能存在也可能不存在于整个文件的多个位置。)
谢谢
【问题讨论】:
【参考方案1】:使用 awk 你可以做到这一点:
awk '/Admin/ && NR == 28 print "exists" ' file
或者使用sed | grep
:
sed '28q;d' file | grep -q 'Admin' && echo "exists"
【讨论】:
我们如何将它与 if in shell 结合使用,即代替 echo 存在。我需要将此作为条件进行检查,&&
确实是一个外壳构造。使用 if/fi
你可以做到 if sed '28q;d' file | grep -q 'Admin'l then echo "exists" else echo "nope"; fi
您仍然可以将awk
与'/Admin/ && NR==28 exit 0 END exit 1'
一起使用。
@chepner awk NR==28print !/Admin/
也会这样做。存在 0 表示成功 1 表示失败,或者删除 !
表示 1 表示匹配 0 表示不匹配。
@karakfa 输出一个值;它不会退出 1 或 0(或者更确切地说,它的退出状态与第 28 行上 Admin
的存在无关)。此外,它假定文件至少有 28 行。【参考方案2】:
使用head
& tail
提取该行,然后使用grep
来检查是否存在:
if head -n28 file | tail -n1 | grep -q '"Admin"' ; then
echo Present
else
echo Not present
fi
【讨论】:
【参考方案3】:使用 awk
awk 'NR==28print (/Admin/?"":"Not ")"present"' file
【讨论】:
【参考方案4】:这可能对你有用(GNU sed):
sed -n '$q1;28/Admin/q0;q1' file && echo present || echo not present
【讨论】:
以上是关于Shell如何检查文件中的一行中是不是存在模式的主要内容,如果未能解决你的问题,请参考以下文章