0

私はこのファイルを手に入れました

root:
    admin = true
    SYSTEM = "compat"
    registry = files
    account_locked = false
    su = true
    sugroups = system,security,sec_grp

daemon:
    admin = true
    expires = 0101000070
    account_locked = true

bin:
    admin = true
    expires = 0101000070
    account_locked = true

シェルスクリプトを使って特定のユーザーとその属性だけを出力したい。を使用しようとしてcatgrepますawkが、まだ解決策が見つかりません。

何か案が?

私のシステム(Solaris 9)ですべての回答をテストしました。まったく機能しません。私は何か間違ったことをしているのかわからないのですか?

4

7 に答える 7

2

簡単なsed解決策は次のとおりです。

sed -ne '/^daemon:/,/^$/p' filename

最後に空白行が含まれますが、短くて覚えやすいものです。

もう 1 つの戦略は、各行でスタンザ レベルのデータを繰り返して、結果を行指向のツールで使いやすくすることです。

awk '/^[a-z]/ {user=$1} (NF>1) {$1=user$1; print}' filename

次の出力が生成されます。

root:admin = true
root:SYSTEM = "compat"
root:registry = files
root:account_locked = false
root:su = true
root:sugroups = system,security,sec_grp
daemon:admin = true
daemon:expires = 0101000070
daemon:account_locked = true
bin:admin = true
bin:expires = 0101000070
bin:account_locked = true

| grep whoeverそのユーザーの属性を表示するには、最後にa を貼り付けることができます。

于 2013-11-04T18:21:51.623 に答える
1

awkで本当に簡単:

$ awk '/^daemon:$/,/^$/' file
daemon:
    admin = true
    expires = 0101000070
    account_locked = true

または、ユーザーを変数から取得したい場合は、次のことができます。

awk -v u="$daemon" '$0 == u,/^$/' file
于 2013-11-04T18:57:55.813 に答える
1

行番号が何であるかを知っていると仮定します:-

sed -n '9,12p' file > output_file

そうでなければ、最初の答えは完璧です。最初の答えは動的であるため、おそらくより良いでしょう。占有する行数に関係なく、デーモンスタンザ全体を取得します。行アドレスを使用していて、それらが変更されると、スクリプトが壊れます。

于 2013-11-04T19:56:45.257 に答える
1

使用できますawk。例:

user=daemon
awk '{if(NF==1 && $1 == "'"$user"':") {flag=1;} else if(NF>1 && flag==1) {print} else {flag=0}}' output.txt

出力:

admin = true
expires = 0101000070
account_locked = true

この形式では、awkスクリプトがより読みやすくなります。

{
    if(NF==1 && $1 == "'"$user"':") {
        # set a flag when the desired user name appears
        flag = 1;
    } else if (NF > 1 && flag==1) {
        # print regular lines if flag is 1
        print;
    } else {
        # if another user name appears reset the flag
        flag = 0;
    }
}
于 2013-11-04T18:12:53.950 に答える
1
awk '$1 == "daemon:"' RS= input-file

RS が空の文字列の場合、awk は段落をレコードとして扱い、最初のフィールド ($1) がユーザー名になるようにフォーマットがレイアウトされます。

于 2013-11-04T21:45:42.207 に答える