File 如何从非标准列中选择

File 如何从非标准列中选择,file,bash,sed,awk,File,Bash,Sed,Awk,我有一个用finger命令得到的文件,我只想保留用户的姓名和访问点。问题是一些用户空闲,他们有一个额外的列,所以访问点列不是标准的,所以我可以使用awk print$z 我有办法做到吗 后来我想,如果我可以选择那个额外的字段,然后用sed或awk删除它,那么如何删除呢?正如您所看到的,有些行具有我用finger选择的空闲时间,有些行不会导致用户没有空闲。我只想保留姓名和接入点。Thnx 文件如下所示: Name1 surname1 22:04 (athedsl-xxxxxxxxx.home.ot

我有一个用finger命令得到的文件,我只想保留用户的姓名和访问点。问题是一些用户空闲,他们有一个额外的列,所以访问点列不是标准的,所以我可以使用awk print$z

我有办法做到吗

后来我想,如果我可以选择那个额外的字段,然后用
sed
awk
删除它,那么如何删除呢?正如您所看到的,有些行具有我用finger选择的空闲时间,有些行不会导致用户没有空闲。我只想保留姓名和接入点。Thnx

文件如下所示:

Name1 surname1 22:04 (athedsl-xxxxxxxxx.home.otenet.gr)
Name2 surname2 (xxxxxxxxxx.dsl.hol.gr)
.
.
.

等等…

我不知道sed/awk,但您可以使用perl一行程序来实现这一点:

cat file | perl -ne 'if (/(\w+)\s+(\w+).*\((.*)\)/) { print "$1 $2 $3\n" }'
现在几乎所有*nix系统上都有Perl,所以希望它能为您工作。根据您提供的数据,您可以获得:

bob surname1 athedsl-xxxxxxxxx.home.otenet.gr
john surname2 xxxxxxxxxx.dsl.hol.gr

我不太熟悉
finger
命令,但我认为您可以使用
awk
这样解决这个问题:

finger | awk'NR>=2{gsub(“[\\(\\\)]”,“,$NF);打印$1”\t“$3”\t“$NF}”


HTH

这可能适合您:

finger | sed '/\([0-9]*:[0-9]*\s*\)\?(\([^)]*\))$/!d;s//\2/'
Name1 surname1 athedsl-xxxxxxxxx.home.otenet.gr
Name2 surname2 xxxxxxxxxx.dsl.hol.gr

以下是几种方法:

awk '{gsub(/^\(|\)$/, "", $NF); print $1, $2, $NF}'

awk 'NF == 4 {$3 = ""}1'

第二个将括号保留在适当位置,并在空闲时间(如果有的话)处留出额外的空间。

请重试。现在我已经编辑了它,我对您的示例数据有点过于文字化…如果您不喜欢tab sep vals.finger,请将打印语句中的
“\t”
替换为
?这个还在吗?真是一个倒退。。。