【问题标题】:How to zgrep an UPPERCASE as a lowercase without pipes / variables / echo如何在没有管道/变量/回声的情况下将大写字母zgrep为小写字母
【发布时间】:2017-08-10 16:41:08
【问题描述】:

如何 zgrep 大写模式,因为它是小写的,例如:

zgrep 'MYPATTERN' *.gz

匹配:我的模式

没有:管道、回声、文件或变量。例如:

s="Hello World!" 
echo $s  # Hello World!
a=${s,,}
zgrep "$a" *.gz

NOR

echo 'MYPATTERN' | sed -e 's/.*/\L&/g'  #this line not tested

NOR

zgrep -i 'MYPATTERN' *.gz #option -i is to heavy

目标是在日志文件中搜索一个简单的十六进制字符串,但它们总是以大写形式给出,但以小写形式记录。

收获是在共享删除服务器中进行的,在该服务器中编写函数并不是最好的。我正在寻找一个干净的解决方案。这就是我避免使用管道和变量的原因。

欢迎使用子命令“``”,但其中没有管道或许多命令。

【问题讨论】:

  • @anubhava 不,它是复制粘贴的。或通过鼠标中键粘贴。
  • 结合小型、专业化的工具,每个工具都能做好一件事,这就是“UNIX 方式”。要求一种工具可以在没有配置、选项或预处理或后处理的情况下开箱即用地完成您想要的一切是……不合理的,除非您希望该工具成为通用编程语言解释器(并且它的参数包含代码)。
  • (完全不清楚你所说的“写一个函数不是最好的”是什么意思。如果你不知道如何方便地通过 ssh 传递一个函数来运行例如,一个远程系统,这是一个已经在本网站上单独提出和回答的问题,所以如果您明确为什么您认为某个功能不起作用,我们可能会提供一个答案:直接谈到了那个紧迫的问题)。
  • @CharlesDuffy 你所有的论点都毫无意义。好的,Linux 是一个 GNU Linux 系统,它有很多二进制文件,可以帮助你到达你想要的地方。但这并不意味着您应该使用 10 个命令而不是 2 个命令。我的需求对这一点非常清楚。
  • 我当然理解所声称的需要。如果这 10 个命令是解释器的内部命令,但 2 个都是外部命令——需要 mkfifo()fork()exeve()wait() 等——那么这 10 个命令在相关命令中的执行速度会快得多案例。对于-i,您根本没有添加任何外部命令。

标签: shell grep pattern-matching zgrep


【解决方案1】:

这是一组疯狂的限制。怎么样

zgrep "$(tr '[:upper:]' '[:lower:]' <<<"MYPATTERN")" *.gz

zgrep -i“太重”怎么办?

【讨论】:

  • 搜索修复模式比任何组合都轻松。
  • 不知道“sed 's/.*/\L&/g' <<< MYPATTERN,这很精简,完全符合我的需求。 zgrep `sed 's/.*/\L&amp;/g' &lt;&lt;&lt; MYPATTERN` *.gz
  • 如果您正在寻找打火机,请添加-F 选项
  • @RodrigoGurgel,一旦你知道它是如何工作的,它就不是那么精简了——它会创建一个临时文件,将内容写入该临时文件,从文件重定向为标准输入,然后将其删除。使用带有参数扩展的变量效率更高,即使您明确表示不希望这样做。
  • @RodrigoGurgel,“更好”意味着更高效?绝对地。 “更好”意味着它符合您的任意约束?那不是我有兴趣玩的游戏。
【解决方案2】:

这可能对你有帮助,但有一个管道

grep -o "string" yourfile | tr [:upper:] [:lower:] 

【讨论】:

  • 执行tr搜索意味着你得到的结果与你事先搜索完全不同。
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 2018-03-28
  • 2015-08-07
  • 2020-08-24
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多