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 awk并假设 ID 从 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 回答
0
awk -F"=" '/id_/{split($0,a,":");}/id=/{i=$2}/groups/{printf a[1]"\t"i"\t"$2"\n"}' your_file

测试如下:

> cat temp
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
> awk -F"=" '/id_/{split($0,a,":");}/id=/{i=$2}/groups/{printf a[1]"\t"i"\t"$2"\n"}' temp
id_1    241     staff
id_2    242     staff
于 2013-05-03T10:05:06.960 回答
0

这可能对您有用(GNU sed):

sed -rn '/^[^ :]+:/{N;N;N;s/:.*id=(\S+).*groups=(\S+).*/\t\1\t\2/p}' file

寻找一行,id然后获取接下来的 3 行并重新排列输出。

于 2013-05-03T10:29:59.407 回答