Shell脚本:如何截取字符串的一部分

19

我有以下字符串

â   â³ eGalax Inc. USB TouchController          id=9    [slave  pointer  (2)]
â   â³ eGalax Inc. USB TouchController          id=10   [slave  pointer  (2)]

我想获取id列表,如何使用sed或其他方法实现?

6个回答

42

我将你的示例内容复制到了一个名为so.txt的文件中。

$ cat so.txt | awk '{ print $7 }' | cut -f2 -d"="
9
10

解释:

  1. cat so.txt 命令将文件的内容输出到 stdout
  2. awk '{ print $7 }' 命令将打印第七列,即包含 id=n 的列
  3. cut -f2 -d"=" 命令将使用等号 (=) 作为分隔符剪切第二列输出 (-f2)

如果您想要同时获取 id=,那么:

$ cat so.txt | awk '{ print $7 }' 
id=9
id=10

谢谢,这正是我想要的! - deimus
1
无用的 cat 和 cut 使用。awk 可以完成所有操作。 - ghostdog74
4
您的意思是“不必要”的使用cat和cut,而不是“无用的”,对吗? - Manoj Govindan
这是一个很好的关于如何结合使用awkcut的解释。我曾尝试在另一个用例中实现类似的功能,但是在awk手册和教程上遇到了很多困难。非常感谢您花时间解释您的代码! - Kevin G.

3
使用正则表达式捕获id号码并用该数字替换整行。类似这样的表达式可以实现(匹配到"id="之前的所有内容,然后匹配任意数量的数字,最后匹配行的其余部分):
sed -e 's/.*id=\([0-9]\+\).*/\1/g'

对于每一行都执行此操作,即可得到id列表。

这个方法返回了9和1,但应该是9和10。 - deimus
好的,我在粘贴sed命令时犯了一个错误。已经更新以使其正常工作。 - bluebrother

2
您可以使用awk而无需使用cut来完成所有操作:
awk '{print substr($7,index($7,"=")+1)}' inputfile

你可以使用split()代替substr(index())

2
$ ruby -ne 'puts $_.scan(/id=(\d+)/)' file
9
10

2

一个Perl解决方案:

perl -nE 'say $1 if /id=(\d+)/' filename

1
假设输入为:
{Anything}id={ID}{space}{Anything} 
{Anything}id={ID}{space}{Anything}

--

#! /bin/sh
while read s; do
   rhs=${s##*id=}
   id=${rhs%% *}
   echo $id # Do what you will with $id here
done <so.txt 

或者如果它总是第七个字段

#! /bin/sh
while read f1 f2 f3 f4 f5 f6 f7 rest
do
echo ${f7##id=}
done <so.txt

参见

Shell参数扩展


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接