web-dev-qa-db-ja.com

シェルスクリプト:文字列の一部を切り取る方法

私は次の文字列を持っています

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

idのリストを取得したいですか?これをsedなどを使用してどのように実行できますか?

13
deimus

サンプルの内容をso.txtという名前のファイルに貼り付けました。

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

説明:

  1. cat so.txtは、ファイルの内容をstdoutに出力します。
  2. awk '{ print $7 }'は7番目の列、つまりid=nを含む列を印刷します
  3. cut -f2 -d"="は、区切り文字として=を使用してステップ#2の出力をカットし、2番目の列(-f2)を取得します

id=も取得したい場合:

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

正規表現を使用してID番号を取得し、行全体を番号に置き換えます。このようなことを行う必要があります(「id =」までのすべてに一致し、次に任意の桁数に一致し、残りの行に一致します)。

sed -e 's/.*id=\([0-9]\+\).*/\1/g'

これをすべての行に対して実行すると、IDのリストが取得されます。

3
bluebrother

Perlソリューション:

Perl -nE 'say $1 if /id=(\d+)/' filename
2
sid_com
$ Ruby -ne 'puts $_.scan(/id=(\d+)/)' file
9
10
2
ghostdog74

awkを使用せずに、cutをすべて実行させることができます。

_awk '{print substr($7,index($7,"=")+1)}' inputfile
_

split()の代わりにsubstr(index())を使用できます。

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 

または、常に7番目のフィールドである場合

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

関連項目

シェルパラメーター展開

0
frayser