Grep 过滤并仅显示行的开头

Grep 过滤并仅显示行的开头

(使用 MacOSX 并可以将其转换为 perl 脚本)。我对 Linux/Unix 命令相当陌生,并且我的 Google 搜索没有成功。

我正在创建一个脚本,以便快速搜索某人的培训记录。我这样做的方法是在一行中列出个人的培训记录(也许有更好的方法?)。当我使用 Grep 搜索特定名称、受训位置或日期时,它会显示整行。我想 grep 搜索特定字符串并仅显示行的开头,IE:前 2 个单词(名字/姓氏。)。

Training.txt 文件看起来与此类似:

Ivie, Shawn 收银员 5/24/2016 储藏室 12/2/2016 服务台 11/31/2016

艾伦,亚当 收银员 5/10/2016 储藏室 12/13/2016

Martinez, Jessica 收银员 5/20/2017 储藏室 10/29/2016 主管 1/23/2016

我现在使用的命令是: grep "Cashier" Training.txt

它返回所有 3 条记录,即所有记录的整行内容。

我试过了: grep -E -o ".{0,0}Cashier.{0,5}" Training.txt

它返回(在本例中为所有 3 条记录),但在“Cashier”之前显示 0 个字符,在“Cashier”之后显示 5 个字符。

Cashier 5/10

我怎样才能合并一个 grep (或者可能是一个 Perl 命令)来搜索“Supervisor”并且只显示前 2 个单词(名称)?其次:有什么想法可以使这种过程变得更容易吗? (电子表格在这种情况下没有用)。

答案1

这非常适合awk

awk '/Supervisor/ { print $1, $2 }' /path/to/inputfile

您甚至可以将搜索限制在第三个字段,这样您就不会误报名为“Supervisor Bob”的人:

awk '$3 ~ /Supervisor/ { print $1, $2 }' /path/to/inputfile

答案2

您可以grep在以下Perl模式下使用:

grep -oP '^(\S+,?\s+){2}(?=Cashier\s)'

结果

Ivie, Shawn
Allen, Adam
Martinez, Jessica

在职的

  • 在 Perl 模式下,grep 从行首查找两个字段 (\S+)。
  • 站在第二个字段的空白末尾,如果我们能够看到收银员后面跟着一个空白,那么我们就找到了匹配项。由于 Cashier 字符串是一个环视,因此它不会包含在匹配中。

相关内容