【问题标题】:shell script cut from variables从变量中剪切的 shell 脚本
【发布时间】:2015-06-22 18:54:47
【问题描述】:

文件是这样的

aaa&123
bbb&234
ccc&345
aaa&456
aaa$567
bbb&678

我要输出:(包含“aaa”和&后面的文字)

123
456

我想在 shell 脚本中做, 关注代码

#!/bin/bash
raw=$(grep 'aaa' 1.txt)
var=$(cut -f2 -d"&" "$raw")
echo $var

它给了我一个类似

的错误
cut: aaa&123
aaa&456
aaa$567: No such file or directory

如何解决?以及如何从现有变量中剪切(或 grep 或其他)?

非常感谢!

【问题讨论】:

  • 忽略文本文件中的“aaa$567”。我打错了(或者应该是aaa&567)

标签: bash shell shellcode


【解决方案1】:

使用 GNU grep:

grep -oP 'aaa&\K.*' file

输出:

123 456

\K:在模式匹配之前忽略所有内容并忽略模式本身

来自 man grep:

-o, --only-matching
      Print only the matched (non-empty) parts of a matching line,
      with each such part on a separate output line.

-P, --perl-regexp
      Interpret PATTERN as a Perl compatible regular expression (PCRE)

【讨论】:

  • 它工作,你知道为什么我的代码不能工作,以及如何从 shell 脚本中的现有变量中剪切 grep 吗?谢谢!
  • 试试这个:raw="$(grep 'aaa&' 1.txt)"; var="$(cut -f2 -d"&" <<< "$raw")"; echo "$var" 或更短:var=$(grep 'aaa&' 1.txt | cut -f2 -d"&"); echo "$var"
【解决方案2】:

赛勒斯有我的投票权。如果 GNU grep 不可用,一个 awk 替代方案:

awk -F'&' 'NF==2 && $1 ~ /aaa/ {print $2}' file

使用&作为字段分隔符,对于有2个字段的行(即&必须存在)并且第一个字段包含“aaa”,打印第二个字段。


您的答案的错误是您将 grep 输出视为 cut 命令中的文件名。你想要的是这样的:

grep 'aaa.*&' file | cut -d'&' -f2

该模式表示“aaa 出现在 & 之前”

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多