Shell 如何使用awk sed或cut命令打印匹配图案后的一行
我想打印文本文件的内容,直到一个字符的模式匹配。我使用了Shell 如何使用awk sed或cut命令打印匹配图案后的一行,shell,unix,awk,sed,sh,Shell,Unix,Awk,Sed,Sh,我想打印文本文件的内容,直到一个字符的模式匹配。我使用了awk命令,但未能获得所需的输出 文件: 我所尝试的: >cat abc1.txt | awk '{print $1}' 2020-05-02 期望输出: 2020-05-02 07:48 2020-05-02 07:48 请帮帮我。您可以在awk中使用sub功能删除上次出现:后的所有内容: awk '{sub(/:[^:]*$/, "")} 1' abc1.txt 您可以将默认字段分隔符更改为:字符并打印前两个字段第一个解
awk
命令,但未能获得所需的输出
文件:
我所尝试的:
>cat abc1.txt | awk '{print $1}'
2020-05-02
期望输出:
2020-05-02 07:48
2020-05-02 07:48
请帮帮我。您可以在awk中使用
sub
功能删除上次出现:
后的所有内容:
awk '{sub(/:[^:]*$/, "")} 1' abc1.txt
您可以将默认字段分隔符更改为:
字符并打印前两个字段第一个解决方案:请尝试以下内容
awk 'match($0,/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}/){print substr($0,RSTART,RLENGTH)}' Input_file
第二种解决方案:与rev
+awk
一起使用,使我们的替换更加容易
rev Input_file | awk '{sub(/[^:]*:/,"")} 1' | rev
第三种解决方案:具有sed
的临时缓冲功能
sed -E 's/([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}).*/\1/' Input_file
第四种解决方案:如果您的输入文件始终具有相同的格式输入,并且您不需要验证日期的语法,请尝试
awk 'match($0,/^.*:/){print substr($0,RSTART,RLENGTH-1)}' Input_file
第五种解决方案:仅添加替代操作awk解决方案
awk '{sub(/:[0-9]{2}\+.*/,"")} 1' Input_file
第六种解决方案:设置字段分隔符值并仅打印所需字段
awk -F' |:' '{print $1,$2":"$3}' Input_file
使用输入和输出字段分隔符(
:
)并用GNU awk删除最后一列:
awk 'BEGIN{FS=OFS=":"} {NF--; print}' abc1.txt
或更短:
awk 'BEGIN{FS=OFS=":"} {NF--}1' abc1.txt
输出:
2020-05-02 07:48
2020-05-02 07:48
见: 我想打印文本文件的内容,直到模式匹配的一个字符 与要保留的内容匹配的正则表达式:
[^:]*:[^:]*
两个等效的sed命令,仅保留与之匹配的内容:
sed 's|\([^:]*:[^:]*\).*|\1|'
sed -E 's|([^:]*:[^:]*).*|\1|'
样本输出:
$ echo '2020 07:48:40:40+0000'|sed 's|\([^:]*:[^:]*\).*|\1|'
2020 07:48
假设您对问题的性质给出了一个公平的表示,您不需要
awk
、sed
或cut
。以下是仅使用内置的bash
处理文本的四种方法:
1. <代码>bash正则表达式
[[$(请将问题的标题固定在一行之后或一个字符之后?您想匹配什么“模式”?我的日期不知道-j
,我需要日期-d”$(@WalterA非常感谢您的投票和日期的注释。我希望您不要反对我将您的解决方案包括在我的答案中,我已将其添加到我的答案中,并记入您的帐户。如果您希望我删除此项,例如,如果您希望添加您自己的答案,请告诉我,我将回滚我的编辑。我猜-j
选项特定于macOS。
sed 's|\([^:]*:[^:]*\).*|\1|'
sed -E 's|([^:]*:[^:]*).*|\1|'
$ echo '2020 07:48:40:40+0000'|sed 's|\([^:]*:[^:]*\).*|\1|'
2020 07:48