如何从手指而不是标准列中进行选择

时间:2012-05-03 21:05:09

标签: file bash sed awk

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

我有什么方法可以做到吗?

我之后想过,如果我可以选择那个额外的字段,稍后使用sedawk将其删除,但如何?正如您所看到的,有些行具有我用手指选择的空闲时间,有些行不会导致用户没有空闲。我只想保留姓名和接入点。日Thnx!

文件是这样的:

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

依旧......

4 个答案:

答案 0 :(得分:1)

我不知道sed / awk,但你可以使用perl one-liner执行此操作:

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

答案 1 :(得分:1)

以下是两种方法:

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

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

第二个将括号留在原位并留出一个额外的空间来代替空闲时间(如果有的话)。

答案 2 :(得分:0)

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

finger | awk 'NR >= 2 { gsub ("[\\(|\\)]","",$NF); print $1"\t"$3"\t"$NF }'

HTH

答案 3 :(得分:0)

这可能对您有用:

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