AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题

问题[awk](unix)

Martin Hope
Ismael Sanchez
Asked: 2025-02-22 00:26:19 +0800 CST

如何使用 awk 从 if/else 语句生成两个输出文件?

  • 8

从以下信息可以看出:

$ cat access.dat
2025/01/01T10:00:01 "GET" /path/resource/api1 User1 500
2025/01/01T10:00:01 "DELETE" /path/resource/api1 User1 503
2025/01/01T04:00:01 "GET" /path/resource/api1 User1 500
2025/01/01T03:00:01 "GET" /path/resource/api1 User1 503
2025/01/01T05:00:01 "PUT" /path/resource/api1 User2 500
2025/01/01T06:00:01 "GET" /path/resource/api1 User1 200
2025/01/01T07:00:01 "GET" /path/resource/api1 User1 201
2025/01/01T08:00:01 "GET" /path/resource/api2 User1 500
2025/01/01T09:00:01 "POST" /path/resource/api2 User2 500
2025/01/01T10:00:01 "POST" /path/resource/api2 User1 400
2025/01/01T11:00:01 "GET" /path/resource/api2 User2 404

我正在尝试生成一个带有 if else 语句的 awk 脚本。执行时

cat access.dat | awk '{if ($NF>=400) {print $0}} > failure.dat 

输出文件已成功生成。但在添加

cat access.dat | awk '{if ($NF>=400) {print $0} > failure.dat else {print$0} > success.dat}

正在标记错误。我的 awk 脚本有什么问题?我如何在 if/else 语句中生成failure.dat 和success.dat?

感谢您的帮助。

awk
  • 3 个回答
  • 459 Views
Martin Hope
vrms
Asked: 2025-01-27 20:18:20 +0800 CST

awk - 如何打印 $5 之后的所有字段?

  • 12

我有类似以下的输出

  975  Jan/21 - 19:59:36 ### sed "/^#include_dir/a include_dir = 'conf.d'" /opt/db/data/efa_bauen_ni_14/postgresql.conf
  986  Jan/21 - 20:04:21 ### grep -l "^port = '5" /opt/db/data/postgres/efa_bauen_ni/conf.d/*.conf | xargs sed -i "s/port = '5/port = '6/"

现在我想将每一行简化为之后的所有内容$5,这样我就可以得到实际的完整命令?

我想我可以做| awk {'print $6, $7, $8, $9, $10, $11'}......等等。但感觉太不科学了,不够灵活而且很丑。

有人能建议如何实现这一点吗,或者我awk一开始就走错了路?

awk
  • 10 个回答
  • 1512 Views
Martin Hope
peti27
Asked: 2025-01-16 00:20:57 +0800 CST

如何选择由两个不同的字符串模式分隔的字符串

  • 4

我有一个类似于下面的文件(filename whatever.com)的输出......

[...]~ # tmsh list sys file ssl-cert whatever.com_2024
sys file ssl-cert whatever.com_2024 {
    certificate-key-size 2048
    checksum SHA1:2520:ab40df7776dbbccb62345560511f2205d
    create-time 2024-08-12:19:34:07
    created-by x.y
    expiration-date 1754956799
    expiration-string "Aug 11 23:59:59 2025 GMT"
    fingerprint SHA256/D8:57:8E:8E:4A:1A:C3:3C:1B:6F:32:59:A7:36:66:92:6C
    issuer "CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1,O=DigiCert Inc,C=US"
    key-type rsa-public
    last-update-time 2024-08-12:19:34:07
    mode 33188
    revision 1
    serial-number 0a:1d:ca:c7:09:7b:49:59:b2
    size 2520
    source-path /var/run/key_mgmt/RvGubB/ssl.crt/whatever.com_2024
    subject "CN=whatever.com,O=XYZ,L=Toronto,ST=Ontario,C=CA"
    subject-alternative-name "DNS:whatever.com"
    updated-by x.y
    version 3

我正在尝试根据第 17 行(以主题开头)上面的信息生成命令输出

cat whatever.com | awk 'BEGIN  {F=" "; FS = "\n"; RS = ""; OFS = "\n"} { print "openssl req -new -nodes -sha256 -newkey rsa:2048 -out "substr($1,RSTART+19,length($1)-25)"_2025.csr -keyout "substr($1,RSTART+19,length($1)-25)"_2025.key -subj "/"substr($17,RSTART+14,length($17)-14)"\""}'

输出看起来不错

openssl req -new -nodes -sha256 -newkey rsa:2048 -out whatever.com_2025.csr -keyout whatever.com_2025.key -subj "/CN=whatever.com,O=XYZ,L=Toronto,ST=Ontario,C=CA"

但是它使用第 1 行的子字符串,该子字符串可能与第 17 行不同,所以我想获取文件名,而不是使用 substr($1,RSTART+19,length($1)-24) 根据“CN=”和“,O=”之间的字符串形式 $17 生成。

如果第 18 行包含字符串“DNS”,那么是否可以将输出修改为如下所示...

openssl req -new -nodes -sha256 -newkey rsa:2048 -out whatever.com_2025.csr -keyout whatever.com_2025.key -subj "/CN=whatever.com,O=XYZ,L=Toronto,ST=Ontario,C=CA" -addext "subjectAltName = DNS:whatever.com"

感谢大家的快速回答。文件名必须从文件中动态生成。包含的示例只是较大输出的一小部分。BEGIN 配置用于创建这些部分,此时可以按行单独处理。

处理 F5 负载平衡器。它们基于 Linux,但并不完全像普通服务器那样构建,这使得一些脚本编写具有挑战性。

我找到了使用 split() 的解决方案,但现在我遇到了另一个问题。当我单独运行该命令时,它似乎有效

 ~ # cat whatever.com | awk 'BEGIN  {F=" "; FS = "\n"; RS = ""; OFS = "\n"} {split($17,a,/,/); print substr(a[1],RSTART+17)}'
whatever.com

然而,当添加到原始脚本中时,它会在前面添加数字“5”。

 ~ # cat whatever.com |  awk 'BEGIN  {F=" "; FS = "\n"; RS = ""; OFS = "\n"} { print "openssl req -new -nodes -sha256 -newkey rsa:2048 -out "split($17,a,/,/); print substr(a[1],RSTART+17)"_2025.csr -keyout "split($17,a,/,/); print substr(a[1],RSTART+17)"_2025.key -subj \"/"substr($17,RSTART+14,length($17)-14)"\""}' 

openssl req -new -nodes -sha256 -newkey rsa:2048 -out 5
whatever.com_2025.csr -keyout 5
whatever.com_2025.key -subj "/CN=whatever.com,O=XYZ,L=Toronto,ST=Ontario,C=CA"
awk
  • 4 个回答
  • 84 Views
Martin Hope
Eddy Sorngard
Asked: 2024-12-27 16:43:51 +0800 CST

在 Bash 中将日期后的列与常数相乘

  • 4

我的文件有两列,包含日期和每天的降水量(以毫米为单位)。

2024/01/01 5
2024/01/02 0
...
2024/12/26 15
2024/12/27 0

现在我将文件的第二列在某个日期之后乘以一个常数。

awk '$2=$2*0.86'  <file>

将第二列的所有值乘以 0.86。

但是我怎样才能将某个日期之后的值与常数相乘呢?

awk
  • 4 个回答
  • 72 Views
Martin Hope
Christopher Karsten
Asked: 2024-12-15 23:39:08 +0800 CST

在同一行上打印特殊字符之间的文本并删除开始和结束的空格

  • 8

我正在尝试实现在特殊字符之间获取文本。您可以按照下面的步骤了解我想要实现的目标。我有必要的命令来执行此操作,但我正在寻找一种更有效的方法,以防某些条件可能根据结果而改变。

下面是文本 On-Line (Prim) 的示例。我想提取“--”第一次和第二次出现之间的任何文本。

所以我在“VAL1”变量中有下面的文本

IBM Informix Dynamic Server Version 14.10.FC10XA -- On-Line (Prim) -- Up 77 days 23:08:31 -- 130337920 Kbytes

因此目前我正在使用以下内容:

echo "$VAL1" | awk -F'--' '$1 ~ /Version/ {print $2}'

以上代码给出以下输出:

 On-Line (Prim)

但是,您看不到行尾必须有空格,但开头非常明显。我想确保只打印“--”之间的单词,而不打印“--”内句子前后的任何空格。

因此我尝试使用下面的方法,对我来说似乎不错:

echo "$VAL1" | awk -F'--' '$1 ~ /Version/ {print $2}' | sed 's/^ //g' | sed 's/ *$//'

输出:

On-Line (Prim)

我想知道是否有更好、更简单、更充分的方法来做到这一点?

awk
  • 4 个回答
  • 279 Views
Martin Hope
Christopher Karsten
Asked: 2024-12-12 18:47:23 +0800 CST

将竖线分隔的列数据转换为电子邮件的 HTML 表格格式

  • 8

我正在尝试将分隔数据格式转换为 html 列表输出以用于电子邮件打印,但我不确定如何使用管道分隔符作为 HTML 表格格式的分隔符。

如果使用空格作为分隔符,则可以使用以下选项,但在此示例中,我使用的是管道符 (|)。

awk ' BEGIN {
print "To: '[email protected]'"
#print "MIME-Version: 1.0"
print "Content-Type: text/html"
print "Subject: This is a test email"
print "<html><body><table border=1 cellspacing=0 cellpadding=3>"
print "<tr>"
print "<td>SID</td>";
print "<td>PID</td>";
print "<td>Username</td>";
print "<td>Database</td>";
print "<td>Hostname</td>";
print "<td>Program</td>";
print "<td>Connected</td>";
print "<td>Idle Time</td>";
print "<td>Query Time</td>";
print "<td>EST COST</td>";
print "<td>SEQ SCAN</td>";
print "<td>Query</td>";
print "</tr>"
} {
print "<tr>"
print "<td>"$1"</td>";
print "<td>"$2"</td>";
print "<td>"$3"</td>";
print "<td>"$4"</td>";
print "<td>"$5"</td>";
print "<td>"$6"</td>";
print "<td>"$7"</td>";
print "<td>"$8"</td>";
print "<td>"$9"</td>";
print "<td>"$10"</td>";
print "<td>"$11"</td>";
print "<td>"$12"</td>";
print "</tr>"
} END {
print "</table></body></html>"
} ' /home/test/test.unl | sendmail -t

test.unl 文件内容如下:

15422216|-1|dwhvo|test|pd244zax.test.corp|N/A|    10:56:53|    -0:00:30|10:57:22|1045127|1|SELECT sba_sub_aux.sba_subscriber_id, sba_sub_aux.sba_id_number, sba_sub_aux.sba_matchcode, sba_sub_aux.sba_marketing, sba_su|

我希望通过电子邮件以表格形式实现以下内容。

在此处输入图片描述

awk
  • 4 个回答
  • 447 Views
Martin Hope
sylvainsab
Asked: 2024-12-09 01:40:28 +0800 CST

BSD sed/awk 将行的一部分移动到上面的行(HTML 文件中的切换属性)

  • 5

我的情况很简单:我有一个HTML 文件,其中有几行仅包含缩进的<section>块标记,每行后面跟着一个(也缩进的)<h3 id="YYYY">...</h3> 标题标记。

就像这样:

    <section>
        <h3 id="2024"><a href="index.fr.html#2024">fr</a> 2024 <a href="index.html#2024">en</a></h3>

当使用锚点链接转到页面内的特定年份(或其翻译)时,年份标题将隐藏在 后面<header>。

通过将属性从 标签向上移动一行即可解决该问题,id<h3><section>

像这样:

    <section id="2024">
        <h3><a href="index.fr.html#2024">fr</a> 2024 <a href="index.html#2024">en</a></h3>

是否有简单的一行或命令可以让我将所有这些id属性从<h3>标签切换到<section>上一行的标签?我还没有找到如何匹配BSD sed或中的多行,尤其是awk。

sed 's:<section>\(\s*\)<h3\( id="\[0-9\]{4}"\):<section\2>\1<h3:g' index.html\n\t\t不会更改文件。代替\s或使用双反斜杠转义也 不会更改文件。

是否有像我假设的那样匹配空格字符的选项GNU sed?也许只能在命令中直接插入/使用换行符/制表符,但我想学得更好,而且因为我在远程工作,不得不使用termux...Android我也没有足够的技能来使用awk解决方法。

awk
  • 1 个回答
  • 34 Views
Martin Hope
Ed Morton
Asked: 2024-12-07 21:13:12 +0800 CST

为什么 grep/sed/awk 中 ' 的 ASCII 转义序列处理方式不同?

  • 13

使用所有 3 个工具的 GNU 版本(向下滚动查看 FreeBSD 尝试),如果我想'使用带有'-delimited 脚本的 awk 在输入中查找,我们可以尝试使用十六进制和八进制转义序列进行匹配:

$ echo "'" | awk '/\x27/'
'

$ echo "'" | awk '/\047/'
'

$ echo "'" | awk '/\o047/'
awk: cmd. line:1: warning: regexp escape sequence `\o' is not a known regexp operator

因此,正如您直观预期的那样,前两个方法有效,而第三个方法无效。

现在让我们用 sed 尝试同样的操作(带或不带-E):

$ echo "'" | sed -n '/\x27/p'
'

$ echo "'" | sed -n '/\047/p'
$

$ echo "'" | sed -n '/\o047/p'
'

和 grep (带或不带-E):

$ echo "'" | grep '\x27'
grep: warning: stray \ before x

$ echo "'" | grep '\047'
grep: warning: stray \ before 0

$ echo "'" | grep '\o047'
grep: warning: stray \ before o

所以:

  1. 最重要的是:它们为什么不同?
  2. 第二个好奇心:有没有办法在 grep 中使用转义序列进行匹配,'而无需诉诸 GNU greps 不可移植-P选项,也不需要在 grep 使用诸如这样的 shell 构造看到转义序列之前扩展转义序列grep $'\047'?

值得注意的是,八进制\047是 awk 中推荐的转义序列(请参阅http://awk.freeshell.org/PrintASingleQuote或https://web.archive.org/web/20230530010453/http://awk.freeshell.org/PrintASingleQuote,如果发生故障)。

就这个问题而言,我对允许文字的替代方案'或其他任何工具的功能或其他任何事情都不感兴趣,我只是想找出为什么这 3 个特定的正则表达式匹配工具对 ASCII 转义序列的处理方式彼此不同。但是,我有兴趣了解 BSD 或这 3 个工具的其他变体在给定上述相同脚本的情况下如何表现。

附加信息:

FreeBSD

这是 FreeBSD 13.1 的行为:

% echo "'" | awk '/\x27/'
'
% echo "'" | awk '/\047/'
'
% echo "'" | sed -n '/\x27/p'
'
% echo "'" | sed -n '/\047/p'
% echo "'" | sed -n '/\o047/p'
sed: 1: "/\o047/p": RE error: trailing backslash (\)
% echo "'" | grep '\x27'
grep: trailing backslash (\)
% echo "'" | grep '\047'
% 

POSIX

以下是正则表达式的 POSIX 标准和相关 3 个工具对此的说明:

  • 正则表达式:https ://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap09.html
  • awk: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/awk.html
  • sed: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/sed.html
  • grep: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/grep.html

从正则表达式规范中我们看到,BRE或EREx中都不0是“特殊字符”,因此它们是“普通字符”,并且

当不在括号表达式中时,未转义字符前面的普通字符的解释是未定义的,但以下情况除外:

后面跟着字符列表,其中不包含0BRE或ERE ,因此我的结论是,在 POSIX 的正则表达式中,既没有定义行为,也没有定义x行为。\x27\047

POSIX awk 规范正则表达式部分说明:

\ddd
一个字符后跟一个、两个或三个八进制数字的最长序列 (01234567)。如果所有数字均为 0(即 NUL 字符的表示),则行为未定义。如果数字产生的值大于八进制 377,则行为未定义。

所以我们知道\0是为 POSIX awk 定义的但\x事实并非如此,所以 awk 的行为\x未由 POSIX 为 awk 定义,因此留给各种 awk 实现。

POSIX sed 规范正则表达式部分为正则表达式添加了一些变化,但没有提及\0或\x并且遵循 POSIX 正则表达式定义,因此POSIX 对于 sed 未定义\0或。\x

POSIX grep 规范描述部分完全遵循 POSIX 正则表达式定义,因此\0POSIX\x对 grep 未定义。

因此显然 的含义\xdd取决于 grep、sed 和 awk 的工具实现者,而 的含义\0dd是为 awk 定义的,但取决于 grep 和 sed 的实现者。

GNU 手册

GNU awk 手册转义序列部分说明:

\nnn
八进制值 nnn,其中 nnn 代表“0”和“7”之间的 1 到 3 位数字。例如,ASCII ESC(转义)字符的代码为“\033”。

\xhh…
十六进制值 hh,其中 hh 代表十六进制数字序列('0'–'9',以及 'A'–'F' 或 'a'–'f')。'\x' 后最多允许两位数字...

这就是\x47GNU awk 的定义。

GNU sed 手册转义序列部分说明:

\oxxx
生成或匹配八进制 ASCII 值为 xxx 的字符。

\xxx
生成或匹配十六进制 ASCII 值为 xx 的字符。

\o047这就是\x27GNU sed 的定义。

GNU grep 手册中没有我找到的对十六进制或八进制转义序列的引用,这解释了我们在尝试使用它们时看到的警告消息,大概意味着它们在 GNU grep 中不受支持。

awk
  • 1 个回答
  • 423 Views
Martin Hope
MikiBelavista
Asked: 2024-11-21 22:46:04 +0800 CST

如何 awk 使得其余行保持完整?

  • 3

我有线

* {@jira: PIVOT-9968} Provide a way to pass an `IMemoryCollector` to `IInternalMemoryMonitored#getMemoryStatistics(memoryCollector)` in order to prevent the count of duplicated blocks.

我只想转义第一个包含票号的字符。 编写脚本以添加反斜杠来 解决我之前的问题

* /{@jira: PIVOT-9968/} Provide a way to pass an `IMemoryCollector` to `IInternalMemoryMonitored#getMemoryStatistics(memoryCollector)` in order to prevent the count of duplicated blocks.

我试过

mawk '/^\* {@jira: PIVOT/ { gsub(/[{} ]/,"\\\\&") } 1' changelog.md > tmp && mv tmp changelog.md

并得到

*\ \{@jira:\ PIVOT-8019\}\ Pivot:\ Added\ `MaxAppendOnlyFunction`\ and\ \ `MinAppendOnlyFunction`\ aggregation\ functions\ that\ do\ not\ support\ disaggregation\ but\ can\ be\ used\ within\ an\ aggregate\ provider.

我应该改变什么?gsub?

awk
  • 1 个回答
  • 68 Views
Martin Hope
Gao
Asked: 2024-11-18 19:36:04 +0800 CST

如何打印 INI 文件中某些部分的所有键值对?

  • 6

INI 文件是 Firefox 的配置文件.ini。我想打印下面的所有内容,包括部分标题,其中是非负整数,每个部分之间用空行分隔。还有一个可选键,它与配置文件部分下的键不同,如果存在,我也想打印它。基本上,shell 脚本只是和之前(打印、以及可选的键和值),但如果添加或删除键,这将失败,并且grep 选项不可移植。[Profilen]nDefault[Install*]Defaultgrep -E 'Default=[^1]' profiles.inigrep -A4 '^\[Profile' profiles.iniNameIsRelativePathDefault-A

下面是我的一个 hack 解决方案,它既不是惯用的 AWK,也不是健壮的 AWK:

/^[[]Profile[0123456789]{1,}[]]$/ {
    print
    while ((getline) > 0) {
        if ($0 ~ /^$/) { # Should really break on new sections.
            print ""
            break
        } else {
            print
        }
    }
}
/^Default=/ {
    print # Default profile path given in the Install* section.
}

示例输入:

[Profile2]
Name=default-test
IsRelative=0
Path=/home/user/ffprofiles/f9bwn86n.default-test

[Profile1]
Name=default
IsRelative=1
Path=x64qf7nv.default
Default=1

[Profile0]
Name=default-release
IsRelative=1
Path=9hv1fbkk.default-release-3426201712696

[General]
StartWithLastProfile=1
Version=2

[Install22379532B4E49482]
Default=9hv1fbkk.default-release-3426201712696
Locked=1

示例输出:

[Profile2]
Name=default-test
IsRelative=0
Path=/home/user/ffprofiles/f9bwn86n.default-test

[Profile1]
Name=default
IsRelative=1
Path=x64qf7nv.default
Default=1

[Profile0]
Name=default-release
IsRelative=1
Path=9hv1fbkk.default-release-3426201712696

Default=9hv1fbkk.default-release-3426201712696

我怎样才能更简洁、更正确地做到这一点?解决方案实际上不必使用 AWK,但我认为 awk 比 sed 或任何其他 Unix 实用程序更适合这种情况。但是,解决方案必须是可移植的并且符合 POSIX 标准。提前谢谢您。

awk
  • 6 个回答
  • 501 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve