【问题标题】:Using grep to find a line and print only 2 words from that line使用 grep 查找一行并从该行中仅打印 2 个单词
【发布时间】:2018-06-26 11:44:32
【问题描述】:

我是 linux 新手,我决定学习 shell 脚本。我创建了一个包含以下文本的文件 data.txt:

12345 Nick Abrams A 10900
67890 George Kennedy I 20000
(text goes on...)

第一个字段是卡的密码,第二个是客户的姓名,第三个是姓氏,第四个表示卡是否有效(或无效),最后一个字段是客户的余额。我需要编写一个从键盘接收客户密码的脚本,如果该密码写在文本文件中,那么脚本应该在屏幕上打印客户的姓名和姓氏。我用过这样的grep

grep "^$pin" data.txt

但它会返回客户的所有详细信息。我只需要打印第二个和第三个字段并忽略其他所有内容。是否有任何参数可以隔离我需要的单词?

【问题讨论】:

  • 我想你可以在这里找到解决方案:stackoverflow.com/questions/19951369/…
  • awk 用作:awk -v pin="$pin" '$1 == pin { print $2, $3 }' data.txt
  • 我相信我没有很好地解释我真正想要什么。我的意思是,如果用户输入 12345,脚本应该打印“Nick Abrams”。不必将其保存在变量中,只需将其打印在屏幕上即可。顺便说一句,我更喜欢使用 grep,因为我还没有学到如何使用 awk。

标签: linux bash


【解决方案1】:

您能否尝试关注一下,如果这对您有帮助,请告诉我。

cat script.ksh
echo "Please enter your choice:"
read value

awk -v val="$value" '$1==val{print $2,$3}' Input_file

编辑:在这里也可以在脚本中添加带有grepcut 的解决方案。

cat script.ksh
echo "Please enter your choice:"
read value

grep "$value" Input_file | cut -d" " -f2,3

【讨论】:

  • 谢谢。但是是否可以使用 grep 作为等效项?
  • @down 投票者,请添加您投反对票的原因。这不公平:(
【解决方案2】:
#!/bin/bash

echo "Enter PIN, please"
read pin

grep "${pin}" pins.txt | awk '{print $2" "$3}'

输入:12345

输出:Nick Abrams

或者cut:

#!/bin/bash

echo "Enter PIN, please"
read pin

grep "${pin}" pins.txt | cut -d' ' -f2,3

【讨论】:

  • 这里不需要使用grep,因为awk 也可以使用shell 变量的值本身搜索特定模式,请参见stackoverflow.com/a/48303804/5866580
  • 不错!任何机会这可以只使用 grep 吗?我不知道如何使用 awk。
  • @JohnM。我看不到只使用grep 的方式。但是如果你不喜欢awk,添加另一个解决方案cut
  • 很好,使用 cut 的第二个选项正是我想要的。我只需要将 "${pin}" 与 "^$pin" 交换即可。
【解决方案3】:

更好地使用 sed:

sed -n 's/^'"$pin \([^ ]* [^ ]*\).*"'/\1/p' data.txt

此命令匹配以$pin 开头的行,并且只写入\(\) 之间正则表达式之后的部分

【讨论】:

  • OP 需要有一个逻辑来在代码中询问用户输入。
  • @RavinderSingh13 我回答最初的问题只是关于如何打印第二个和第三个字段并忽略其他所有内容
猜你喜欢
  • 2016-05-14
  • 2021-04-18
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多