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

Bash 使用cut awk grep和sed的基础知识,bash,shell,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等? 谢谢 Grep旨在打印出与RE匹配的整行。让它只打印一行的一部分将相对困难(最

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

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等?
谢谢

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


使用SED,您可以使用与其余部分匹配的RE,并用任何东西替换它,留下您关心的部分。

< P>如果您真的只是从代码>日期>代码中寻找当前的一年,您可以直接考虑运行这个。

date +%Y
无需后处理。:)


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

cut
/
awk
/
sed
非常适合拆分文本行
grep
有助于找到所需的行

更为晦涩(也不太便于携带)的是,但它们可以快速且有趣地使用

$ MYDATE=`date`
$ echo $MYDATE
Mon Feb 8 16:28:04 EST 2010
$ echo ${MYDATE##* }
2010
你可能想退房。就语法而言,它与
sed
awk
有很大的区别,是一种完整的编程语言,有一个巨大的库()来帮助您集成各种不同的系统


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

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/'

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

对于大文件,请使用grep查找模式,并通过管道连接到awk/sed以操纵文本

例如,如果要获取
date
命令的年份,请使用
date+%Y

获取
日期的年份的各种方法

$ date +%Y
2010

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

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

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

使用GNU grep,您可以使用-o(--only matching)仅显示匹配行中与模式匹配的部分。模式下面是一个Perl正则表达式(-P,--Perl regexp),用于一行中的四位数字:

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

当你发布它的时候,我正在输入完全相同的答案。我要进一步补充的唯一一件事是阅读手册,了解更多的格式选项。事实上,我想说nour现在有了阅读手册页的“授权”。
$()
比backticks(考虑引号和转义)更容易使用,也不容易出错。还有许多其他shell脚本语言(这仅仅意味着可以使用shebang行)出于类似的原因工作得很好。这是非常正确的。我的首选是perl,但出于历史原因,我准备接受这一点,今天我可能会选择ruby/python等。让GNU grep只打印一行的一部分并不困难。试试-o(--仅匹配)标志。@Philip:谢谢--我没有注意到那个标志(尽管我可能已经看过它的帮助文本几百次了…)