如何从linux中的字符串中过滤所需的内容?

时间:2015-03-25 11:03:06

标签: linux string

我有一个字符串: -

sometext sometext BASEDIR=/someword/someword/someword/1342.32 sometext sometext.

有人能告诉我,如何从linux中的上述字符串过滤这个数字1342.32

3 个答案:

答案 0 :(得分:0)

如果某个文本总是通过空格与周围的字段分隔,请尝试使用

cat log.txt | awk '{for (i=1;i<=NF;i++) {if ($i ~
/BASEDIR/) {print i,$i}}}' | awk -F/ '{for (i=1;i<=NF;i++) {if ($i ~
/^[0-9][0-9]*$/) {print $i}}}'

上面的代码片段假设您的数据包含在名为log.txt的文件中并按记录组织(请阅读此awk-wise)

答案 1 :(得分:0)

$ echo "sometext BASEDIR=/someword/1342.32 sometext." |
    sed "s/[^0-9.]//g"
> 1342.32.

sed命令 s 可以搜索不在集合中的任何内容&#34; 0123456789&#34;或&#34;。&#34;,并将其替换为空(删除它)。它是在 g 小节模式中执行此操作,因此它不会在第一场比赛中停止。

如果您只想尝试阅读它,这就足够了。如果您尝试将号码输入另一个命令并需要一个实数,则需要清理它:

$ ... | cut -f 1-2 -d "."
> 1342.32

cut分割 d elemiter上的输入,然后选择 f ields 1和2(从1开始编号)。所以&#34; 1.2.3.4&#34;将返回&#34; 1.2&#34;。

答案 2 :(得分:0)

如果数字在sometext之前显示在BASEDIR以及输入中还有其他行,则此方法也有效:

sed -n 's,.*BASEDIR=\(/\w*\)*/\([0-9.]*\).*,\2,p'
  • -n不输出没有BASEDIR…
  • 的行
  • \(/\w*\)* /someword组,重复
  • \([0-9.]*\)重复数字或小数点组
  • \2用第二组替换匹配的所有内容(整行)
  • p打印结果