ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux-cut,colrm,awk和sed的奇怪问题:无法从管道流中剪切字符

2019-12-08 20:50:40  阅读:191  来源: 互联网

标签:cut awk sed linux pipe


我创建了一个脚本来枚举目录及其下的所有文件.我想使用pv添加一些进度反馈,因为我通常从根目录使用它.

问题是发现它的时间输出(%TT)总是包含小数秒,但我不想记录太多细节.

如果我编写脚本一次完成每件事,那么我将获得正确的输出.但是,如果我使用中间文件在“第二次”传递中进行估算,结果将发生变化,我看不出原因.

这个版本给出正确的结果:

#!/bin/bash

find -printf "%11s %TY-%Tm-%Td %TT %p\n" 2> /dev/null |
# - Remove the fractional seconds from the time
# before:       4096 2011-01-19 22:43:51.0000000000 .
# after :       4096 2011-01-19 22:43:51 .
colrm 32 42 |
pv -ltrbN "Enumerating files..." |
# - Sort every thing by filename
sort -k 4

但是排序可能需要很长时间,因此我尝试了类似的方法,以得到更多反馈:

#!/bin/bash

TMPFILE1=$(mktemp)
TMPFILE2=$(mktemp)

# Erase temporary files before quitting
trap "rm $TMPFILE1 $TMPFILE2" EXIT

find -printf "%11s %TY-%Tm-%Td %TT %p\n" 2> /dev/null |
pv -ltrbN "Enumerating files..." > $TMPFILE1
LINE_COUNT="$(wc -l $TMPFILE1)"

#cat $TMPFILE1 | colrm 32 42 |                   #1
#cat $TMPFILE1 | cut -c1-31,43- |                #2
#cut -c1-31,43- $TMPFILE1 |                      #3
#sed s/.0000000000// $TMPFILE1 |                 #4
awk -F".0000000000" '{print $1 $2}' $TMPFILE1 |  #5
pv -lN "Removing fractional seconds..." -s $LINE_COUNT > $TMPFILE2

echo "Sorting list by filenames..." >&2
cat $TMPFILE2 |
sort -k 4

5个“解决方案”均无效.输出中将保留“ .0000000000”部分.

有人可以解释为什么吗?

我的最终解决方案是将切割操作与查找结合起来,并且仅使用一个临时文件.仅排序是单独完成的.

解决方法:

您可以使用字段精度说明符(至少使用GNU find 4.4.2)截断-printf参数中的秒数:

find -printf "%11s %TY-%Tm-%Td %.8TT %p\n"

在“ HH:MM:SS”中保留八个字符.

我剩下的答案可能没有意义:

您的1-5号不起作用的原因是wc的输出包含文件名(尤其是空格).该空格使pv将wc命令中的文件名视为输入文件.命令行参数的优先级高于stdin.由于它恰好与通过管道传递的输入文件相同,因此输出文件看起来像是未处理的输入文件(因为它是正确的,因为忽略了管道).

要仅捕获计数而没有文件名:

LINE_COUNT=$(wc -l < "$TMPFILE1")

以下是一些小改进:

< $TMPFILE1 colrm 32 42 |                   #1 No need for cat

要么

colrm 32 42 < $TMPFILE1 |                   #1

< $TMPFILE1 cut -c1-31,43- |                #2

要么

cut -c1-31,43- < $TMPFILE1 |                #2

sed s/\.0000000000// $TMPFILE1 |            #4 The dot should be escaped

标签:cut,awk,sed,linux,pipe
来源: https://codeday.me/bug/20191208/2094077.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有