使用cut或awk命令打印第一行的第一个字段

105
我试图打印输出的第一行的第一个字段。这是情况。我只需要从这个输出中打印出SUSE
# cat /etc/*release

SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 2

尝试使用cat /etc/*release | awk {'print $1}',但它会打印每行的第一个字符串

SUSE
VERSION
PATCHLEVEL
11个回答

248

如果您想捕获所选行的输出,请指定 NR

awk 'NR==1{print $1}' /etc/*release

另一种(丑陋的)实现方式如下:

awk '{print $1; exit}'

从输出中获取特定行(比如第42行)的第一个字符串的高效方法为:

awk 'NR==42{print $1; exit}'

@jaypal 我也考虑过添加一个 tac file | awk 'END{print $1}' 但后来意识到这可能有点过了。 - devnull
虽然这会让你的丑陋解决方案看起来比丑恶的方案明显更漂亮! - jaypal singh
4
它并不“丑陋”。事实上,它更好了,因为对于大文件来说,它会在找到并停止处理时节省大量时间。 - Jotne
@Jotne,我称它为丑陋,只是因为NR==1是_隐含的_。在答案中添加了另一个例子,可能更加清晰明了。 - devnull
@devnull,我知道,但OP的要求很清楚,“打印输出的第一行的第一个字符串”,所以在这里使用“exit”就可以了。 - Jotne
显示剩余2条评论

25

使用内置变量NR指定行号

awk 'NR==1{print $1}' /etc/*release

11

试试这个:

head -1 /etc/*release | awk '{print $1}'

5
df -h | head -4 | tail -1 | awk '{ print $2 }'

更改数字以根据您的喜好进行微调。

或者使用while循环,但那可能是一种不好的做法。


现在这是一个巧妙的黑客技巧! - Abhinav Thakur

4
你可以使用 head 而不是 cat:
head -n1 /etc/*release | awk '{print $1}'

3

awk,sed,管道,这很重

set `cat /etc/*release`; echo $1

3
sed -n 1p /etc/*release |cut -d " " -f1

如果是制表符分隔的:
sed -n 1p /etc/*release |cut -f1

1

尝试

sed 'NUMq;d'  /etc/*release | awk {'print $1}'

其中NUM是行号

ex. sed '1q;d'  /etc/*release | awk {'print $1}'

这将打印整个第一行而不是第一个字段,正如OP所述。 - jaypal singh
回答是 “萨拉斯切潘托杜兰布切”。 可以用 sed 命令来完成 - sed -r'1s/([^ ]+) .*/\1/;q' /etc/*release :) - jaypal singh

0

我能想到的在 awk 中仅打印第一行的最简代码:

awk '_{exit}--_'    # skip the quotations and make it just
                    #   awk _{exit}--_
                    #
                    # if u're feeling adventurous 
  1. 第一次通过退出块时,"_"未定义, 因此它失败并跳过了第1行。

  2. 然后,同一个计数器的递减将使其在 awk 的眼中变为 "TRUE"(任何非空字符串或数字零都被视为 "true" 在他们敏捷的布尔意义上)。同样的计数器也触发了默认的打印操作,用于第1行。

    ——增加…减少…这是同一件事,
       只是方向和符号相反。
    
  3. 最后,在第2行开始时,它满足进入操作块的条件,该操作块指示它立即退出,从而执行与

awk '{ print; exit }'

以稍微简洁的方式来表达。对于单行打印,甚至不值得设置FS来跳过字段分割部分。

使用该概念仅打印第一第一个字段:

awk '_{exit} NF=++_'
awk '_++{exit} NF=_'

0
awk 'NR==1&&NF=1' file
grep -om1 '^[^ ]\+' file

# multiple files
awk 'FNR==1&&NF=1' file1 file2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接