【问题标题】:how to grep a string from a particular line? [closed]如何从特定行 grep 字符串? [关闭]
【发布时间】:2020-04-27 19:31:19
【问题描述】:

我想通过导航到特定行来搜索字符串,如何在 shell 脚本中执行此操作?

例如, 我有

this is the first line 
this is the Second line
This is the Third line

现在我想通过转到第 3 行来查找字符串“Third”。

感谢您的帮助。

【问题讨论】:

  • 示例中的文字应该是一行一行的,我不知道为什么它是一行
  • 始终建议在 SO 上显示您的问题中的输入样本和预期输出样本,所以请务必添加相同的内容,然后让我们知道。
  • @ZeeshanHaris :请在询问时更准确:您想知道以验证文件的第 3 行是否包含此特定字符串?所以输出应该只是一个是/否的指示?
  • @user1934428 说我有一个包含 n 行的文件,我总是想转到它的第 3 行并搜索子字符串,如果存在则返回它跨度>

标签: linux bash shell sh


【解决方案1】:

尝试将 cat、sed 和 grep 串在一起。

sed '3!d' filename | grep Third

未命名或anonymous pipe (|) 和redirection () 是许多shell 的强大功能。它们允许组合一组命令来执行更复杂的功能。

在这个问题的情况下,有两个明确的步骤, 1)对文件的特定行进行操作(例如过滤文件) 2) 在过滤器的输出中搜索特定的字符串

认识到有两个步骤是需要组合两个命令的有力指标。因此,可以通过为每个步骤找到解决方案,然后通过管道和重定向将它们组合成一个命令来解决问题。

如果您了解 Stream Editor (sed),在考虑如何完成过滤文件的第一步时,您可能会想到它。如果不搜索,“linux get a specific line of a file”this OS question 在搜索结果中排名靠前。

$ cat tmp.txt
this is the first line
this is the Second line
This is the Third. line

$ sed '3!d' tmp.txt
This is the Third. line

知道 grep 可以搜索带有感兴趣字符串的行,下一个挑战是弄清楚如何将 sed 的输出作为 grep 的输入。管道 (|) 解决了这个问题。

sed '3!d' filename | grep Third

示例输出:

$ sed '3!d' tmp.txt | grep Third
This is the Third. line
$

shell 脚本中另一个强大的概念是exit status。 grep 命令将在找到匹配项时将退出状态设置为 0,在未找到匹配项时设置为 1。 shell 将退出状态存储在一个名为 $? 的特殊变量中。 (对于bash)。因此,可以使用退出状态来有条件地确定 shell 脚本中的下一步。下面的示例没有实现条件(如 if、else)。下面的示例显示了使用 echo 命令的退出状态值。

$ sed '3!d' tmp.txt | grep Third
This is the Third. line
$ echo $?
0
$ sed '3!d' tmp.txt | grep third
$ echo $?
1
$

【讨论】:

  • 你能解释一下吗?在这吗?
  • @EricB :cat 在这里是不必要的。只需做一个sed ... < filename。我还会在 grep 中添加 -F 选项,以防 OP 想在某一天搜索包含句点的字符串。
  • awk 时,没有必要同时运行sedgrep(当然不是三个 单独的可执行文件,sedgrepcat)可以做这两个部分。 awk 'NR == 3 && /Third/' 如果只想在第 3 行包含字符串 Third 时发出任何输出
猜你喜欢
  • 1970-01-01
  • 2017-09-20
  • 2022-01-20
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多