我有一个从 PHP 页面运行的 arp 扫描。它可以很好地发现我网络上的特定设备。唯一的问题是我必须更改 mac 信息以删除冒号,然后将所有字母默认为大写。
这是我的命令:
$output = shell_exec("sudo arp-scan --interface=eth0 --localnet --numeric --quiet| grep -e 80:82:87");
它仅检索以以下开头的 MAC 地址80:82:87
我发现一个 sed 命令可以将所有字母更改为大写,但在该命令中却没有。我怎样才能做到这一点?
答案1
tr
非常适合这样的简单操作:
echo '80:82:87:af:d2' | tr '[:lower:]' '[:upper:]' | tr -d ':'
答案2
awk 可以进行模式匹配、大写和一次性更换:
awk '/^80:82:87/ {gsub(/:/,""); print toupper($0)}'
答案3
sed
你可以这样做:
sed -n '/^80:82:87/ { s/;//g; y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/; p }'
- 该
-n
选项告诉sed
您不要打印其输入,除非明确指示这样做。 - 表示大括号
/^80:82:87/
内的命令{…}
只能在以 开头的行上执行80:82:87
。这为您提供了与grep
.您永远不需要通过管道grep
输入sed
orawk
。 - 该
s/;//g
命令删除该行中的所有分号,这就是您所说的您想要的。如果您指的是冒号,则只需将其更改为s/://g
。 - 该
y
命令将所有小写(罗马/ASCII)字母转换为大写。如果您只需要转换 MAC 地址(和/或其他十六进制值),则可以使用y/abcdef/ABCDEF/
. - 最后,打印修改后的行。
@jasonwryan 促使我意识到,繁琐的命令可以用、 、 甚至y
替换 ——但前提是您使用的是 GNU sed。 POSIX 中似乎没有定义。s/[[:lower:]]/\U&/g
s/[[:alpha:]]/\U&/g
s/.*/\U&/
\U
答案4
我忽略了这样一个事实,即这可能最好在 PHP 中使用 PHP 的字符串操作函数(因为这就是您正在使用的内容)来完成,可能通过类似$addr = strtoupper(str_replace(":", "", $output))
.相反,我将重点关注特定于 Unix 的 shell 解决方案。
使用awk:
awk 'BEGIN { RS=":"; ORS = "" } { print toupper }' <<<"$mac_address"
测试:
$ mac_address="xx:yy:zz:k7:23:f0"
$ awk 'BEGIN { RS=":"; ORS = "" } { print toupper }' <<<"$mac_address"
XXYYZZK723F0
Awk 程序将读取 MAC 地址的每个部分作为单独的记录(否则记录通常是一行输入),并在没有记录分隔符的情况下打印它们(否则输出记录分隔符默认为换行符)。在打印每条记录之前,它将其转换为大写。