Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何使用awk sed或cut命令打印匹配图案后的一行_Shell_Unix_Awk_Sed_Sh - Fatal编程技术网

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