插入字段分隔符以在shell脚本中排列和捕获变量中的值

时间:2013-01-29 22:36:06

标签: bash shell sed awk

我的输出格式不是很好,导致捕获变量值时出现问题。

例如:

This is counter1 1000
this counter2 2000
this counter3 is higher value 3000

现在从上面的文件我想要捕获1000,2000和3000.如果我使用awk与print $ x,其中x =任何值,那么它为每一行分配不同的值。 如果我使用$ 4然后第一行我将能够选择1000但是对于第二行它将不提供任何值,而对于第三行它将打印更高,因此我想插入字段分隔符并读取变量。非常感谢任何帮助!

6 个答案:

答案 0 :(得分:5)

如果号码始终是最后一个字段,则可以

{ print $NF }

答案 1 :(得分:1)

如果您只想要最后一个参数,并且只有数字:

echo $'For example:\nThis is counter1 1000\nthis counter2 2000\n
     this counter3 is higher value 3000\ndone.\n' |
  sed -ne 's/^.* \([0-9]\{1,99\}\)/\1/p'

1000
2000
3000

您甚至可以捕获计数器的编号(因此只读包含counterX的行):

echo $'For example:\nThis is counter1 1000\nthis counter2 2000\n
     this counter3 is higher value 3000\ndone.\n' |
  sed -ne 's/^.*\(counter[0-9]\{1,99\}\) \(.* \)\{0,1\}\([0-9]\{1,99\}\)$/\1 \3/p'

counter1 1000
counter2 2000
counter3 3000

甚至只是找到分隔符:

echo $'For example:\nThis is counter1 1000\nthis counter2 2000\n
     this counter3 is higher value 3000\ndone.\n' |
  sed -ne 's/^\(.*counter[0-9]\{1,99\}.*\) \([0-9]\{1,99\}\)$/\1 :: \2/p'
This is counter1 :: 1000
this counter2 :: 2000
this counter3 is higher value :: 3000

或,或......

echo $'For example:\nThis is counter1 1000\nthis counter2 2000\n
     this counter3 is higher value 3000\ndone.\n' |
  sed -e 's/^\(.*counter[0-9]\{1,99\}.*\) \([0-9]\{1,99\}\)$/\1 :: \2/'

For example:
This is counter1 :: 1000
this counter2 :: 2000
this counter3 is higher value :: 3000
done.

答案 2 :(得分:1)

要打印最后一个单词,请使用

awk '{ print $NF }'

要分隔数字,可以使用

cat yourfile | tr ' ' '\n' | egrep '^[0-9]+$'

或GNU特定grep -ow '[0-9]*' yourfile

要仅查找该行上的第一个单词,您可以使用

awk '{ for(i=0; i<=NF; i++) if($i ~ /^[0-9]+$/) { print $i; break; } }'

答案 3 :(得分:0)

要仅使用sed打印最后一个元素,请使用以下内容:

sed 's/.* //'

测试输入:

cat << EOF > infile
This is counter1 1000
this counter2 2000
this counter3 is higher value 3000
EOF

运行测试:

<infile sed 's/.* //'

输出:

1000
2000
3000

答案 4 :(得分:0)

使用sed的其他方式

sed -re 's/(.*)\s([0-9]+)/\2/' temp.txt

输出

1000
2000
3000

答案 5 :(得分:0)

正如其他建议你可以在awk中使用$ NF。 如果所有数字都是最后一个字段,你也可以使用perl:

perl -F -lane 'print $F[scalar(@F)-1]' your_file

或者如果它不总是最后一个字段,那么:

perl -F -lane 'for(@F){print if(/^\d+$/)}' your_file