如何只打印票号?

如何只打印票号?

以下是文件的内容,我只需要打印“[]”中包含的票号。很想知道是否可以使用 sed 和 grep 命令来完成此操作。

[request://Problem/26727777] SSO Components (UAT)
[request://Problem/25709048] [SERVER-SETUP] Setup 14xMDN, 10xPRN 
[request://Problem/26716590] Logs not populated properly from all servers
[request://Problem/23995808] Prod: Create requestmary

输出应该是:

26727777
25709048
26716590
23995808

我尝试过sed -e 's/[^0-9]//g' ticket | sed '/^$/d',但无法获得所需的输出。它还包括该行中的其他数值,我只需要获取票号:

226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216

答案1

您可以使用 GNU grep

$ grep -oP '/\K\d+(?=])' ticket 
26727777
25709048
26716590
23995808

或者sed

sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808

上述两者都适用于您给出的示例,但它们是否适用于您的真实文件将取决于文件中的其他行。它们打印 a 之后的所有数字/,对于grep,打印 a 之前的所有数字]。如果您还有其他符合这些条件的行,您将需要向我们展示您的整个文件。

答案2

我个人会使用perl。

perl -lne 'print /(\d+)\]/'

应该做到这一点。

-l说“整理换行符” - 它会自动将它们从行中删除,并将它们插入到每个print.

-n说'将其包装在一个while (<>) {循环中 - 它像会那样逐行迭代 STDIN (或文件)grep

并且-e是“表达式”(或“执行”我猜)来运行引号中的命令。 (否则perl请从 读取程序STDIN

我们使用正则表达式的默认匹配是 against $_(在这种情况下,即当前行)这一事实。

因为我们指定了一个捕获组,所以它返回捕获值的(单个元素)列表,而不是返回“true”或“false”:

\d+是一位或多位数字。 (这是一个“高级”正则表达式,与 大致相似[0-9]+,但如果您使用非拉丁数字,其工作方式会有所不同),并且我们需要在]其后面添加一个。

并且因为我们g在正则表达式的末尾使用,每行仅匹配一次。

答案3

sed 's/[^0-9]*\([0-9]*\).*/\1/'

但如果票号有固定宽度,我宁愿使用cut.

编辑:使用 grep: grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'

答案4

tr "\[\]/" " "| awk '/request/ {  print $3 }'

相关内容