web-dev-qa-db-ja.com

bash:コマンド出力からのgrepパターン

私は本当にbashの初心者ですが、それは学校の科目の1つです。演習の1つは次のとおりです。

自分のログインに関する情報がある「/ etc/passwd」ファイルの行番号を指定します。

USERNAMEが自分のログインIDであるとすると、次のように完全に実行できました。

 cat /etc/passwd -n | grep USERNAME | cut -f1

これは単に必要な行番号を与えただけです(より最適化された方法があるかもしれません)。しかし、whoamiの出力を使用してgrepパターンを表すようにコマンドをより一般的にする方法があるかどうか疑問に思いましたスクリプトなしまたは変数を使用せずに。つまり、次のように、読みやすい1行のコマンドを保持します。

 cat /etc/passwd -n | grep (whoami) | cut -f1

これが本当にnoobの質問である場合はごめんなさい。

15
MarioDS
cat /etc/passwd -n | grep `whoami` | cut -f1 

コマンドを `マークで囲むと、コマンドが実行され、ラップされたコマンドに出力が送信されます。

23
Lynn Crumbling

これは、単一のawk呼び出しで実行できます。

awk -v me=$(whoami) -F: '$1==me{print NR}' /etc/passwd

さらに詳細に:

  • -vは、awkというme変数を作成し、ユーザー名を入力します。
  • -Fは、パスワードファイルに合わせてフィールドセパレータを:に設定します。
  • $1==meは、最初のフィールドがユーザー名と一致する行のみを選択します。
  • printはレコード番号(行)を出力します。
11
paxdiablo

bashのmanページでコマンドの置換を確認してください。

ティックを_``_または$()に戻すことができますが、個人的には後者を好みます。

だからあなたの質問のために:

_grep -n -e $(whoami) /etc/passwd | cut -f1 -d :
_

は、whoamiの出力をgrepコマンドの_-e_フラグの引数として置き換え、コマンド全体の出力は、_/etc/passwd_の行番号になります。実行中のユーザー。

9
Chilledrat