web-dev-qa-db-ja.com

ファイルから文字列を検索して切り取る方法は?

私はそのようなオプションと引数を使用してプログラムを作成しようとしています:

./program.sh -f <filename> -string <string>

プログラムは、次のように<filename>で始まる<string>の行を出力することになっています。

 grep ^<string> <filename> 

さらに、次のサンプル入力ファイルの名前や年齢など、文字列に関連付けられたいくつかの情報を返すことになっています。

string name age sex
Akdk john 22 male
Jrtkfp miah 26 female

そのような動作を実現するにはどうすればよいですか?

2
N. Kouk

ワンライナーでこれほど簡単な操作を行うことができます。そのためのスクリプト全体は必要ありません。 ~/.bash_aliasesファイルに配置できる関数を使用して、開いているすべての端末にロードされるようにします。

function_name(){ awk /^$2/'{print $1": "$2", "$3}' $1 ;}

これにより、次のようにfunction_name <filename> <string>を呼び出して結果を取得できます。

$ cat test
string name age sex
Akdk john 22 male
Jrtkfp miah 26 female

$ function_name test Akdk
Akdk: john, 22

ご覧のとおり、オプションなしでこの目標を達成できます。引数のみを使用する方がはるかに簡単です。オプションが必要な場合は、 このチュートリアル および この記事 をお勧めします。

説明

  • function_name(){ … ;}function_nameを実行する関数を定義します
  • awk /^$2/'{…}' $1 –関数の最初の引数($1)として指定されたファイル内で、2番目の引数(^)で始まる行($2)を検索します機能し、それをする
  • awk '{print $1": "$2", "$3}' –最初の列(スペースで区切られた)、次に「:」、2番目の列、「、」、3番目の列の順に印刷します

注:例$1は、bash(端末を実行するもの)とawkで異なる意味を持ちます。最初の引数は、最初に指定した引数に展開し、2番目は最初の列のショートカットとして解釈します。 awkprintコマンドを単一引用符(')で囲む必要があるのは、そのためbash$1を展開せず、awkを解析しないようにするためです。

6
dessert