重定向到在bash中存储awk的变量

时间:2016-02-27 06:28:17

标签: linux bash

cat list.txt

1 apple 4 30 f 2 potato 2 40 v 3 orange 5 10 f 4 grapes 10 8 f

脚本:getlist ::

if  [[ "$@" == *[f]* ]] ; then
  awkv1 = $(grep f | awk '{ print $2  $3 }')
else
  awkv1 = $(awk '{ print $2 $4 $5 }')
fi

cat list.txt  | $(awkv1)

我有一个变量awkv1,它根据参数'f'存储值。 但它没有用。 Running :: getlist f没有做任何事情。

它应该像这样工作:: 如果'f'在参数中传递,则:: cat list.txt | grep f | awk '{ print $2 $3 }'

否则:: cat list.txt | awk '{ print $2 $4 $5 }'

3 个答案:

答案 0 :(得分:1)

您需要在脚本中执行一些更正:

  1. 删除awkv1 = $
  2. 的空格
  3. 而不是grep f使用grep 'f$'。此方法仅匹配最后一列中的字符f,并避免带有字母f的水果,例如 fig ,在最后一列以v.
  4. 结尾时匹配
  5. cat list.txt | $(awkv1)替换为echo "$awkv1",因为上一个命令的输出已存储在变量$awkv1中。
  6. 更正后的脚本版本:

    if  [[ "$@" == *[f]* ]] ; then
      awkv1=$(grep 'f$' | awk '{ print $2, $3 }')
    else
      awkv1=$(awk '{ print $2, $4, $5 }')
    fi
    
    echo "$awkv1"
    

    您可以通过以下方式调用此脚本:cat list.txt | getlist f

答案 1 :(得分:1)

为什么不做以下事情:

档案:获取列表

#!/bin/sh
if [ "$1" = "f" ]; then
    awk '$5=="f"{print $2,$3}' list.txt
else
    awk '{print $2,$4,$5}' list.txt
fi

如果此文件是可执行文件,您可以将其命名为:

$ ./getlist f
apple 4
orange 5
grapes 10
$ ./getlist
apple 30 f
potato 40 v
orange 10 f
grapes 8 f
$

或者,如果要在命令行上指定搜索值:

#!/bin/sh
if [ "$1" ]; then
    awk -v t="$1" '$5==t{print $2,$3}' list.txt
else
    awk '{print $2,$4,$5}' list.txt
fi

这样,您可以列出标记为fv的字段:

$ ./getlist
apple 30 f
potato 40 v
orange 10 f
grapes 8 f
$ ./getlist f
apple 4
orange 5
grapes 10
$ ./getlist v
potato 2
$ 

答案 2 :(得分:1)

在字符串变量中存储部分命令行更容易使用bash数组。

您可以像这样调整脚本:

#!/bin/bash

# store awk command line in an array
if  [[ "$*" == *f* ]]; then
  awkcmd=(awk '/f/{ print $2, $3 }')
else
  awkcmd=(awk '{ print $2, $4, $5 }')
fi

# execute your awk command
"${awkcmd[@]}" list.txt