来自egrep的数字导致一行

时间:2017-12-23 19:03:25

标签: grep

我使用egrep输出一些带有平台名称的行:

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        print("getter of x called")
        return self._x

我需要的是:

XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$"

[30]    i686-nptl-linux-gnu
[34]    i686-w64-mingw32
[75]    x86_64-unknown-linux-gnu
[77]    x86_64-w64-mingw32

如何将egrep命令传递给sed / awk / bash脚本?

4 个答案:

答案 0 :(得分:3)

尝试:

$ command | awk -F'[][ \t]+' '/i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/{printf "%s%s",(f?",":"export PLATNUMS="),$2; f=1} END{print""}'
export PLATNUMS=30,34,75,77

工作原理

  • -F'[][ \t]+'

    使用任意数量的空格,制表符或[]作为字段分隔符。

  • /i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/ {...}`

    对于感兴趣的行,请执行花括号中的命令。

  • printf "%s%s",(f?",":"export PLATNUMS="),$2; f=1

    对于感兴趣的行,打印我们想要的内容。

    变量f标记这是否是第一条感兴趣的线。

  • END{print""}

    阅读完所有行后,打印换行符。

创建shell变量

export PLATNUMS=$(command | awk -F'[][ \t]+' '/i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/{printf "%s%s",(f?",":""),$2; f=1} END{print""}')

例如,如果文件输入包含您的数据:

$ export PLATNUMS=$(awk -F'[][ \t]+' '/i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/{printf "%s%s",(f?",":""),$2; f=1} END{print""}' input)
$ declare -p PLATNUMS
declare -x PLATNUMS="30,34,75,77"

对于那些喜欢将命令分散在多行中的人:

export PLATNUMS=$(command | awk -F'[][ \t]+' '
    /i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/{
        printf "%s%s",(f?",":""),$2
        f=1
    }

    END{
        print""
    }
    ')

答案 1 :(得分:1)

也许这样,我不能尝试你的egrep。

export PLATNUMS=$(XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$" | sed ':A;s/\[\([[0-9]*\)].*/\1/;$bB;N;bA;:B;s/\n/,/g')
echo $PLATNUMS

这是如何工作的?

您的egrep命令会返回多行文字 所以sed以这种方式逐行阅读这篇文章

sed '
:A                      # label A

# here with your example
# on the first line the pattern space look like that
# [30]    i686-nptl-linux-gnu

# on the second line the pattern space look like
# 30
# [34]    i686-w64-mingw32

s/\[\([[0-9]*\)].*/\1/  # substitute all digit enclose by [] by only the digit

# on the first line the pattern space become
# 30

# on the second line the pattern space become
# 30
# 34

# and so on for each line

$bB                     # on the last line jump to B
N                       # get a newline in the pattern space
bA                      # It is not the last line so jump to A
:B                      # label B

# here we have read all the line
# the pattern space look like that without the #
# 30
# 34
# 75
# 77

s/\n/,/g'               # subtitute all \n by a comma

# the pattern space become
# 30,34,75,77

# $(XXX | egrep .... | sed ...) return 30,34,75,77 in the variable PLATNUMS

# It is better not to use all capital letters in your variable name

答案 2 :(得分:0)

GNU sedtr

$ XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$" | sed -E 's,]\s+.+$,,g'  | sed 's,^\[,,g' | tr '\n' ',' | sed -E 's,(^.+$),export PLATNUMS=\1,' | sed 's/,$//' && echo

我不确定您要实现的目标,但您可能希望自动eval输出export

$ eval $(XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$" | sed -E 's,]\s+.+$,,g'  | sed 's,^\[,,g' | tr '\n' ',' | sed -E 's,(^.+$),export PLATNUMS=\1,' | sed 's/,$//' && echo)
$ echo $PLATNUMS                                                                                                                                                                                  
30,34,75,77

答案 3 :(得分:0)

如果你认为你需要grep + sed或2 greps或2 seds或任何其他组合,那么你应该使用1来调用awk,当你使用awk时你永远不需要grep或sed:

export PLATNUMS=$(XXX | awk -F'[][]' '/(i686-nptl-linux-gnu|i686-w64-mingw32|x86_64-unknown-linux-gnu|x86_64-w64-mingw32)$/{p=(p ? p "," : "") $2} END{print p}')

顺便说一下它有用,这里有几个简短的正则表达式:

(i686-(nptl-linux-gnu|w64-mingw32)|x86_64-(unknown-linux-gnu|w64-mingw32))$
((i686-nptl|x86_64-unknown)-linux-gnu|(i686|x86_64)-w64-mingw32)$

并且根据您的输入数据(因为这将包括上面未提供的组合),您可能只需要:

(i686|x86_64)-(nptl|unknown|w64)-(linux-gnu|mingw32)$