我在linux系统中有一个日志文件(.txt格式)。想要提取以" 1499"开头的所有数据并写入另一个文件。日志中有两种类型的数据,一种是13位长,另一种是38位长。
我想要grep,sed或awk命令的任何建议。
日志文件示例:
1499186243519, 36533, 0, 0, 0, 0, 0, 0, 0, 0
1499186244816, 35237, 0, 0, 0, 0, 0, 0, 0, 0
1499186244837, 35224, 0, 0, 0, 0, 0, 0, 0, 0
1499182567904?
1499182567982 -> 200 OK, 0 bytes
1499182568007?
14991855787919196616688454500234291584**
14991855788021403876667136479787697727**
14991855803593386396169567154870815462**
输出应如下所示:
1499186243519
1499186244816
1499186244837
1499182567904
1499182567982
1499182568007
14991855787919196616688454500234291584
14991855788021403876667136479787697727
14991855803593386396169567154870815462
答案 0 :(得分:3)
假设:
$ echo "$log"
1499186243519, 36533, 0, 0, 0, 0, 0, 0, 0, 0
1499186244816, 35237, 0, 0, 0, 0, 0, 0, 0, 0
1499186244837, 35224, 0, 0, 0, 0, 0, 0, 0, 0
1499182567904?
1499182567982 -> 200 OK, 0 bytes
1499182568007?
14991855787919196616688454500234291584**
14991855788021403876667136479787697727**
14991855803593386396169567154870815462**
你可以这样做:
$ echo "$log" | sed -E 's/^(1499[[:digit:]]*).*$/\1/'
1499186243519
1499186244816
1499186244837
1499182567904
1499182567982
1499182568007
14991855787919196616688454500234291584
14991855788021403876667136479787697727
14991855803593386396169567154870815462
这也有效:
$ sed -E 's/^(1499[[:digit:]]*).*$/\1/' file
file
拥有该内容......
或awk
:
$ echo "$log" | awk -F[^0-9] '/^1499/{print $1}'
或者grep:
$ echo "$log" | grep -o '^1499[[:digit:]]*'
答案 1 :(得分:0)
使用GNU grep和扩展正则表达式(-E
):
grep -Eo -e '^1499[0-9]{9}' -e '^1499[0-9]{34}' file
输出:
1499186243519 1499186244816 1499186244837 1499182567904 1499182567982 1499182568007 14991855787919196616688454500234291584 14991855788021403876667136479787697727 14991855803593386396169567154870815462
答案 2 :(得分:0)
使用Bash:
$ while read -r;do [[ $REPLY =~ ^1499[0-9]* ]] && echo ${BASH_REMATCH} >>new_log.txt;done <log.txt
$ cat new_log.txt
1499186243519
1499186244816
1499186244837
1499182567904
1499182567982
1499182568007
14991855787919196616688454500234291584
14991855788021403876667136479787697727
14991855803593386396169567154870815462
答案 3 :(得分:0)
GNU awk 版本,打印长度为13或38的数字,即使同一行上有 多个 : / p>
$ awk -v p="([[:digit:]]{38}|[[:digit:]]{13})" '{for (i=1; i<=NF; i++){ if (match($i, p, a)) print a[1]}}' input.txt
输入:
$ cat input.txt
1499186243519, 36533, 0, 0, 0, 0, 0, 0, 0, 0, 14991855803593386396169567154870815462**
1499186244816, 35237, 0, 0, 0, 0, 0, 0, 0, 0
1499186244837, 35224, 0, 0, 0, 0, 0, 0, 0, 0
1499182567904?
1499182567982 -> 200 OK, 0 bytes
1499182568007?
14991855787919196616688454500234291584**
14991855788021403876667136479787697727**
14991855803593386396169567154870815462**
给出:
$ awk -v p="([[:digit:]]{38}|[[:digit:]]{13})" '{for (i=1; i<=NF; i++){ if (match($i, p, a)) print a[1]}}' input.txt
1499186243519
14991855803593386396169567154870815462
1499186244816
1499186244837
1499182567904
1499182567982
1499182568007
14991855787919196616688454500234291584
14991855788021403876667136479787697727
14991855803593386396169567154870815462
答案 4 :(得分:0)
GREP COMMAND
grep -Eo“^([1] [4] [9] [9] [0-9] {1,13} | [1] [4] [9] [9] [0-9] { 1,38})“abc.txt
使用-E访问扩展正则表达式语法
设置-o只输出该行的匹配段,而不是该行的全部内容
^表示模式中字符串的开头。 1499是在开始后固定的字符串模式,之后可以跟随任何数字,长度可以是13位和38位。