0

スタンザ形式のファイルがあります。ファイルの例は以下の通りです。

id_1:
        id=241
        pgrp=staff
        groups=staff
        home=/home/id_1
        shell=/usr/bin/ks
id_2:
        id=242
        pgrp=staff
        groups=staff
        home=/home/id_2
        shell=/usr/bin/ks

sed または awk を使用してそれを処理し、id 名、id、およびグループのみを単一行およびタブ区切り形式で返すにはどうすればよいですか? 例えば:

id_1        241     staff
id_2        242     staff
4

6 に答える 6

2

awkで:

BEGIN { FS="="}

$1 ~ /id_/ { printf("%s", $1) }

$1 ~ /id/ && $1 !~ /_/ { printf("\t%s", $2) }

$1 ~ /groups/ { printf("\t%s\n", $2) }
于 2013-05-03T06:15:07.907 に答える
1

awk ソリューションは次のとおりです。

翻訳.awk

#!/usr/bin/awk -f
{
  if(match($1, /[^=]:[ ]*$/)){
    id_=$1
    sub(/:/,"",id_)
  }
  if(match($1,/id=/)){
    split($1,p,"=")
    id=p[2]
  }
  if(match($1,/groups=/)){
    split($1,p,"=")
    print id_," ",id," ",p[2]
  }
}

次のいずれかで実行します。

chmod +x translated.awk
./translated.awk data.txt

また

awk -f translated.awk data.txt

完全を期すために、ここに短縮版があります。

#!/usr/bin/awk -f
$1 ~ /[^=]:[ ]*$/ {sub(/:/,"",$1);printf $1" ";FS="="}
$1 ~ /id/         {printf $2" "}
$1 ~ /groups/     {print $2}
于 2013-05-03T06:18:06.360 に答える
0
 sed 'N;N;N;N;N;y/=\n/  /' data.txt | awk '{print $1,$3,$7}'
于 2013-05-03T06:55:34.483 に答える
0

設定によるワンライナーアプローチは次のRSとおりです。

awk 'NR>1{print "id_"++i,$3,$7}' RS='id_[0-9]+:' FS='[=\n]' OFS='\t' file
id_1    241     staff
id_2    242     staff

GNU awkID が 1 から昇順である必要があり、それを前提としています。

ID の順序が任意の場合:

awk '!/shell/&&NR>1{gsub(/:/,"",$1);print "id_"$1,$3,$5}' RS='id_' FS='[=\n]' OFS='\t' file
id_1    241     staff
id_2    242     staff
于 2013-05-03T09:32:11.207 に答える