无法从 grep 中排除包含 ^M 的行

无法从 grep 中排除包含 ^M 的行

我有以下文件,我只想Removed '2022-01-30_01-00-05'在最后从中提取。

Removing '2022-01-30_01-00-05'...
  0.46% complete (00:03:45 remaining)^M  5.49% complete (00:00:17 remaining)^M 24.90% complete (00:00:06 remaining)^M 60.56% complete (00:00:01 remaining)^M 82.12% complete (00:00:00 remaining)^M 82.39% complete (00:00:01 remaining)^M 84.24% complete (00:00:01 remaining)^M 86.48% complete (00:00:01 remaining)^M 88.58% complete (00:00:01 remaining)^M 89.66% complete (00:00:01 remaining)^M101.08% complete (00:00:00 remaining)^M104.62% complete (00:00:00 remaining)^M                                                                                ^MRemoved '2022-01-30_01-00-05'

我已经尝试过dos2unix,但没有成功。

我已经尝试了下面的这些变体,但是当我less output他们要么不删除^M字符,要么捕获整行:

tr -d $'\r' < /file | grep "Removed" > output
tr -d '^M' < /file | grep "Removed" > output
tr -d ^M < /file | grep "Removed" > output
sed 's/\r//g' < /file | grep "Removed" > output

答案1

grep命令将打印整个匹配行,并且由于 *nix 中的行是由\n和 not定义的\r,因此您所描述的是正常行为。换句话说,您的第一个和最后一个命令( thetr -d '\r'和 the sed 's/\r//g')都按预期工作,只是 grep 正在执行它应该执行的操作并打印整行。

仅打印部分一行,你需要 GNUgrep及其-o选项。例如:

$ grep -oP "Removed\s*'[^']+'" file
Removed '2022-01-30_01-00-05'

或者,将\r(the ^M) 更改为换行符而不是删除它们:

$ tr '\r' '\n' < file | grep Removed
Removed '2022-01-30_01-00-05'

或者

$ sed 's/\r/\n/g' file | grep Removed
Removed '2022-01-30_01-00-05'

答案2

dos2unix\r从行尾 ( ) 之前剥离 control-Ms ( ) \n- 这不是你所拥有的,你有 control-Ms代替行尾。因此dos2unix不帮助你。

使用用于多字符 RS 的 GNU awk 并使用任何\rs 和/或\ns 序列作为记录分隔符:

$ awk -v RS='[\r\n]+' '/^Removed/' file
Removed '2022-01-30_01-00-05'

答案3

awk '{for(i=1;i<=NF;i++){if($i ~ /Removed/){print $i,$(i+1)}}}' filename| awk '{gsub(/\^M/,"",$0);print }'

输出

Removed '2022-01-30_01-00-05'

答案4

您的输入文件有 Mac 换行符。您可以将它们转换为 Unix 换行符

dos2unix -c mac file

或者

mac2unix file

要找出文件的换行符类型,可以使用以下命令:

dos2unix -ih file

相关内容