我需要一个 grep 或 sed 语句,它只会从该语句中取出日期:
echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd'
所以答案应该是这样的:
12-Dec-13 11-Jan-12
我已经走得够远了12-Dec-13 asdasd asdf 11-Jan-12
,但我无法删除日期之间的内容。是否可以使用 sed 语句来保留第一个单词和最后一个单词,使用空格来显示哪个是最后一个单词?结果应该保持不变。
一组 POSIX 字符类将匹配您想要的文本。例如:
\b[[:digit:]]{2}-[[:upper:]][[:lower:]]{2}-[[:digit:]]{2}\b
以下管道将使用 GNU Grep 仅提取相关文本,然后连接日期:
$ echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' |
grep -Eo '\b[[:digit:]]{2}-[[:upper:]][[:lower:]]{2}-[[:digit:]]{2}\b' |
xargs
12-Dec-13 11-Jan-12
grep -o "[0-9]\{2\}-[^0-9]\{3\}-[^a-z]\{2\}" file | sed "N;s/\n/ /g"
2013 年 12 月 12 日 2012 年 1 月 11 日
试试这个:
echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's: :\n:g' | grep ^[0-9]
perl -lne '@a=/([\d]+-[a-zA-Z]{3}-[\d]+)/g;print "@a"'
测试:
> echo 'asdfdsfa 12-Dec-13 asdf 11-Jan-12 asdasd' | perl -lne '@a=/([\d]+-[a-zA-Z]{3}-[\d]+)/g;print "@a"'
12-Dec-13 11-Jan-12
使用以下
echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's/ /\n/g' |grep '-' | tr -d '\n' |sed 's/$/ \n/g'
输出是
12-Dec-1311-Jan-12
单程:
$ echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's/.*\(..-...-..\).*\(..-...-..\).*/\1 \2/'
12-Dec-13 11-Jan-12
要使搜索模式更具体地用于数字和字母:
$ echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's/.*\([0-9][0-9]-[a-zA-Z]\{3\}-[0-9][0-9]\).*\([0-9][0-9]-[a-zA-Z]\{3\}-[0-9][0-9]\).*/\1 \2/'
12-Dec-13 11-Jan-12
我建议date -d
。所以它甚至会验证日期。
$ cat string
asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd
$ for i in `cat string`; do date -d $i &>/dev/null && echo $i; done
12-Dec-13
11-Jan-12
用 awk 试试
awk '{for(i=1; i<NF; ++i){if ($i ~ /[0-9]+[-\w]*/) print $i}}' temp.txt
适用于任意数量的行和列
这可能对您有用(GNU sed):
sed -r 'H;g;:a;s/\s*\n$//;t;s/\n(..-...-..)\b/\1 \n/;ta;s/\n([^0-9]+)/\n/;ta' file
我可以访问日志,其中日期格式愚蠢:[30/Jun/2013:08:00:45 +0200]
但我需要将其显示为:30/Jun/2013 08:00:45
问题是在我的 grep 语句中使用“OR”时,我在 2 个分隔行上收到了 2 个匹配表达式。
这是解决方案:
grep -in myURL_of_interest *access.log | \
grep -Eo '(\b[[:digit:]]{2}/[[:upper:]][[:lower:]]{2}/[[:digit:]]{4}|[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}\b)' \
| paste - - -d" " > MyAccess.log
我希望它有帮助:)