我有一个grep命令,它提供以下字符串:
20121121001100 18 0 16 2 18
但我想修改此字符串以获取
20121121 001 18 0 16 2 18
以上提取的值如下:
for i in `ls -1 file.txt | sort`; do echo $i`
grep datetime $i | wc -l ``
grep abc $i | wc -l ``
grep def $i | wc -l ``
grep ghi $i | wc -l ``
grep jkl $i | wc -l ` ; done | cut -c9-500
使用cut -c9-500是因为原始字符串是
的形式datetime20121121001100 18 0 16 2 18
并剪切-c9-500返回
20121121001100 18 0 16 2 18
有人可以请我帮忙吗
20121121 001 18 0 16 2 18
(即从日期部分删除最后3位数字)
答案 0 :(得分:1)
您希望/做的大部分内容都可以通过awk
完成。但是你想要的最低限度:
for i in `ls -1 file.txt | sort`; do echo $i`
grep datetime $i | wc -l ``
grep abc $i | wc -l ``
grep def $i | wc -l ``
grep ghi $i | wc -l ``
grep jkl $i | wc -l ` ; done | cut -c9-500 | awk '{print substr($0,1,11) substr($0,15) }'
awk
非常有能力进行文字处理。
编辑:我不确定你在做什么,但是,基本上这几乎是相同的:
awk 'FILENAME != oldfilename {oldfilename = FILENAME; dt = 0 ; a = 0; d = 0; g = 0; j = 0}
/datetime/ {dt++}
/abc/ {a++}
/def/ {d++}
/ghi/ {g++}
/j/ {j++}
END {print FILENAME, dt, a, d, g, j}' *
它更快,更少进程等...基本上awk处理文件,计算指定字符串的出现次数,以及何时完成文件(在最后一行之后)打印报告。
更改了规格:
for i in `ls -1 file.txt | sort`; do echo $i`
grep datetime $i | wc -l ``
grep abc $i | wc -l ``
grep def $i | wc -l ``
grep ghi $i | wc -l ``
grep jkl $i | wc -l ` ; done | cut -c9-500 | awk '{print substr($0,1,8) " " substr($0,9,4) substr($0,15) }'
答案 1 :(得分:0)
管道sed:
echo "20121121001100 18 0 16 2 18" | sed -r 's/^([0-9]+)[0-9][0-9][0-9] (.*)$/\1 \2/'
给出
20121121001 18 0 16 2 18