首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于grep是否有一个优雅的正则表达式,一个包含各种分隔符的MAC地址?

对于grep是否有一个优雅的正则表达式,一个包含各种分隔符的MAC地址?
EN

Stack Overflow用户
提问于 2022-07-28 23:44:52
回答 3查看 112关注 0票数 -1

我偶尔会在syslog服务器上搜索聚合日志文件以获得特定的MAC地址。由于每个源对MAC地址使用不同的格式,所以我通常使用以下命令:

代码语言:javascript
运行
复制
less syslog.log | grep -i -E '56[:-\.]?ea[:-\.]?b6[:-\.]?a6[:-\.]?82[:-\.]?5e'

无论格式或大小写如何(56eab6a6825e56ea.b6a6.825e56:ea:b6:a6:82:5e56-EA-B6-A6-82-5E),都会找到地址。

我将这个命令保存在文本文件中,这样我就可以用相关的数字替换每个十六进制对并粘贴到其中,但是是否有一种优雅的方式来格式化我的regex,我可以将整个地址放在一起呢?例如:

代码语言:javascript
运行
复制
less syslog.log | grep -i -E '56eab6a6825e[:-\.]?(anywhereinthestring)'

我基本上想在搜索时变得更懒,但我不太了解它们在这种情况下是否适用。这有可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-29 00:36:16

只需将要搜索的mac地址存储在变量中,并使用Bash的替换扩展值生成grep的Regex。

代码语言:javascript
运行
复制
mac='56:ea:b6:a6:82:5e'

# Compose a regex on-the fly by replacing all colons with [:.-]?
grep -iE "${mac//:/[:.-]?}"

或与某项功能相同:

代码语言:javascript
运行
复制
grepmac() {
  # Usage:
  # grepmac MAC_ADDRESS FILE [FILE]...

  # Parses input argument 1 as mac-address
  # regardless if it uses delimiters or not.
  # Returns failure if input argument 1 is not a mac-address.
  [[ $1 =~ ([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2}) ]] || return 1

  # Sets delimiter locally to : to join matches with colon
  local -- IFS=:
  # Joins matches except first to get a colon-delimited mac-address
  mac="${BASH_REMATCH[*]:1}"

  # Shifts out first argument away to only keep remaining file paths
  shift

  # Composes a regex by replacing colons in mac-address by [:.-]?
  # which matches optional delimiter with : . or - 
  regex=${mac//:/[:.-]?}

  # Performs the actual search
  grep -iE "$regex" "$@"
}

grepmac的跟踪执行

代码语言:javascript
运行
复制
$ set -x; grepmac 56eab6a6825e

+ grepmac 56eab6a6825e
+ [[ 56eab6a6825e =~ ([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2})[:.-]?([[:xdigit:]]{2}) ]]
+ IFS=:
+ mac=56:ea:b6:a6:82:5e
+ shift
+ regex='56[:.-]?ea[:.-]?b6[:.-]?a6[:.-]?82[:.-]?5e'
+ grep --color=auto -iE '56[:.-]?ea[:.-]?b6[:.-]?a6[:.-]?82[:.-]?5e'
票数 3
EN

Stack Overflow用户

发布于 2022-07-29 00:26:19

这里有一个函数,它接受MAC地址--大写或小写,有标点符号,也有标点符号--并从它构造正则表达式。您可以像运行grep一样运行它,可以使用文件列表,也可以不从stdin读取任何文件。

代码语言:javascript
运行
复制
grep-mac() {
    local mac="$1"
    local files=("${@:2}")

    # Strip punctuation from the input MAC.
    mac="${mac//[^[:alnum:]]}"
    # Create a regex by inserting `[:-\.]?` in between every two characters.
    local regex="${mac:0:2}$(sed -E 's/../[:-\\.]?\0/g' <<< "${mac:2}")"

    # Call `grep` with the regex and files we were passed.
    grep -iE "$regex" "${files[@]}"
}

示例用法:

代码语言:javascript
运行
复制
❯ grep-mac 56:ea:b6:a6:82:5e syslog.log | less
❯ grep-mac 56EAB6A6825E syslog.log | less

如果您希望访问方便,可以将其放入您的~/.bashrc中。

票数 1
EN

Stack Overflow用户

发布于 2022-07-29 00:11:32

你可以试试这个grep

代码语言:javascript
运行
复制
$ grep -Ei '56[[:alnum:]:.-]+5e' <(less syslog.log)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73160255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档