使用cut awk grep和sed的基础知识

时间:2010-02-08 21:03:05

标签: bash shell

我正试图从这个输出中提取年份:

sam@sam-laptop:~/shell$ date
Mon Feb  8 21:57:00 CET 2010

sam@sam-laptop:~/shell$ date | cut -d' ' -f7
2010

sam@sam-laptop:~/shell$ date | awk '{print $6}'
2010

还有其他方法可以获得相同的结果吗?使用也许grep,sed等? 谢谢!

6 个答案:

答案 0 :(得分:10)

如果你真的只是从date寻找当前年份,你可能会考虑直接运行它。

date +%Y

无需后期处理。 :)


更新:关于文字处理的评论(因为OP正在寻找那些)

cut / awk / sed非常适合拆分文字。 grep有助于找到你想要的行。

bash-specific regexp-like operators更加模糊(不太便携),但使用起来既快捷又有趣。

$ MYDATE=`date`
$ echo $MYDATE
Mon Feb 8 16:28:04 EST 2010
$ echo ${MYDATE##* }
2010

答案 1 :(得分:2)

一些sed变体:

date | sed 's/.* //'

date | sed 's/.*\(....\)$/\1/'

date | sed 's/.*\(.\{4\}\)$/\1/'

date | sed -r 's/.*(.{4})$/\1/'

date | sed -r 's/.*([[:digit:]]{4})$/\1/'

答案 2 :(得分:1)

Grep旨在打印出与RE匹配的整行。让它只打印出一行的一部分将是相对困难的(充其量)。

使用sed,您可以使用与该行的其余部分匹配的RE,并将其替换为空,留下您关心的部分。

答案 3 :(得分:1)

您可能需要查看Perl。它在语法方面从sedawk大量提升,是一种完整的编程语言,带有巨大的库(CPAN),可帮助您集成各种不同的系统。

当我发现我的简单awk / sed解决方案必须扩展到最简单的情况之外时,我迁移到了Perl。

答案 4 :(得分:1)

grep在文件中查找模式。但是,它不会修改您的文件。 sed查找模式以及修改文件。 cut是一个“剪切”文件中的列以显示/(或文件)的工具。如果您的任务非常简单,只需获取一些列就可以使用它。 awk在您的文件中查找模式,您可以通过创建另一个文件来对其进行修改。 awk做的是sed,grep,cut,所以你只用一个工具就可以做任何事情。

对于大尺寸文件,使用grep查找模式和管道到awk / sed以处理文本。

对于您的示例,如果您想获得date命令的年份,请使用date +%Y

获取date命令的年份的各种方法

$ date +%Y
2010

$ date | awk '{print $NF}'
2010

$ var=$(date)
$ set -- $var
$ eval echo \${${#}}
2010

最后,您可以像使用某些sed示例一样使用正则表达式,但我发现最简单的方法就是拆分字段并获取最后一个字段。不需要复杂的正则表达式。

答案 5 :(得分:1)

使用GNU grep,您可以使用-o(--only-matching)仅显示匹配模式的匹配行的部分。模式下方是连续四位数的Perl正则表达式(-P, - perl-regexp):

$ date | grep -oP '\d{4}'
2010