我有一个填充了一堆数据的文本文件。我需要提取包含特定字符串的行。我使用 awk 使用以下方法完成了此操作:
awk '/pattern1|pattern2|pattern3/ {print;}' infile
Run Code Online (Sandbox Code Playgroud)
然后我需要在第 3 行之后放置一个新行 (\n)。所以它需要看起来像这样
pattern1
pattern2
pattern3
<new line>
pattern1...
Run Code Online (Sandbox Code Playgroud)
我能够通过将第一个命令通过管道传输到另一个 awk 语句来完成此操作
awk -F '\n' '/pattern1|pattern2|pattern3/ { print; }' infile | awk '{ if ((NR % 3) == 1) printf("\n"); print; }'
Run Code Online (Sandbox Code Playgroud)
我认为必须有一种更有效的方法来做到这一点,所以我开始寻找如何将这两个命令组合在一起。我尝试了以下方法:
awk '/pattern1|pattern2|pattern3/ { if ((NR % 3) ==1 ) printf("\n"); print; }'
Run Code Online (Sandbox Code Playgroud)
我认为这会起作用,但输出是完全不可预测的,有时有 5 行组合在一起,2 行为一组,但没有 3 行。
我在想可能存在分隔符问题,所以我尝试使用 -F 选项并设置 IFS,但都没有改变输出。
我想我在尝试将模式匹配与 if 语句结合起来的方式上做了一些愚蠢的事情,但我无法弄清楚组合。
我在单个 awk 命令中尝试做的事情是可能的吗?如果是这样,我哪里出错了?
我正在尝试解析由 expec 脚本生成的文本文件,该脚本从开关中提取一些信息。
这是一个示例输出:
192 0000.0000.0000 1/g23 Dynamic
192 0000.0000.0000 ch1 Dynamic
192 0000.0000.0000 ch1 Dynamic
192 0000.0000.0000 ch1 Dynamic
Run Code Online (Sandbox Code Playgroud)
文本文件中有很多我不感兴趣的其他垃圾。我只想要包含交换机号和端口的行 - 上面示例中的“1/g23”。
我对文件做了一个 grep 来提取包含模式 '/g' 的行,它工作得很好。
现在我想要的只是中间的两列。我使用 awk 打印列。
0000.0000.0000 1/g23
Run Code Online (Sandbox Code Playgroud)
既然完成了,我想搭上“。” sed 为此工作正常
000000000000 1/g23
Run Code Online (Sandbox Code Playgroud)
从这里我只想将第一列转换为 MAC 地址格式。
So this
000000000000 1/g23
Becomes this
00:00:00:00:00:00 1/g23
Run Code Online (Sandbox Code Playgroud)
我能够找到一个可以完成此任务的 sed 命令。但我的问题是我只需要在第一列上完成。我不太确定如何只编辑一列而不丢失 MAC 和端口之间的关联。
grep -e "/g" switch6output | awk '{print $2,$3}' | sed 's/\.//g' | sed 's/../&:/g;s/:$//'
Run Code Online (Sandbox Code Playgroud)
我敢肯定这是一种非常愚蠢的方法,但这是我能想到的最好的方法。有没有更可靠的方法可以在不丢失 MAC 和端口关联的情况下完成我需要的操作?
谢谢你。