awk
是一种功能强大的文本处理工具,它能够对文本数据进行模式扫描、处理和报告。以下是 awk
的一些主要特性和用法:
-
模式匹配:
awk
的名称来源于其创始人 Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan 的姓氏首字母。它最初被设计为一种模式扫描和处理工具。 -
内置变量:
awk
提供了多个内置变量,如$0
(当前记录)、$1
、$2
…(字段)、NR
(记录数)、FS
(字段分隔符,默认为空格)、OFS
(输出字段分隔符,默认为空格)等。 -
字段分隔符:通过
-F
选项或在脚本中设置FS
变量,可以定义字段的分隔符,例如使用:
或正则表达式作为分隔符。 -
模式动作:
awk
脚本由模式和动作组成。模式可以是正则表达式或匹配所有记录的模式(如NR
),动作是当模式匹配时执行的命令序列。 -
数组:
awk
支持关联数组,允许使用字符串作为索引。 -
控制流:
awk
支持if-else
、while
、for
和break
、continue
等控制流语句。 -
内置函数:
awk
提供了丰富的内置函数,如length()
、split()
、sub()
、gsub()
等。 -
模式和动作的组合:可以组合多个模式和动作,对文本进行复杂的处理。
-
命令行和脚本文件:可以在命令行中直接使用
awk
,也可以将awk
脚本写入文件中执行。 -
程序化扩展:
awk
可以通过其程序化接口与其他程序集成,如 Perl 或 Python。
以下是一些 awk
的基本用法示例:
-
打印文件中的每一行:
awk '{print}' filename
-
打印文件的第一列(字段):
awk '{print $1}' filename
-
使用正则表达式打印包含特定文本的行:
awk '/pattern/ {print}' filename
-
计算文件中的行数:
awk 'END {print NR}' filename
-
将字段分隔符设置为逗号,并打印第二列:
awk -F, '{print $2}' filename
-
将文本文件中的字段用不同的分隔符输出:
awk '{printf "%s|%s\n", $1, $2}' filename
-
计算某个模式出现的次数:
awk '/pattern/ {count++} END {print count}' filename
awk
是一个非常灵活的工具,适用于各种文本处理任务,从简单的文本打印到复杂的数据转换和分析。
awk文本转成Redis command
有一份role.csv文件,需要把每一行作为key-value写入redis。内容如下:
Administrator@DESKTOP-CKPKB5K MINGW64 /d/temp
$ cat role.csv
1702150998967975938,1
1704318750462914562,1
1704692754463825921,1
1705054538352656386,1
...
每一行使用,分割,前面为key的一部分,后面为value。
awk 生成批指令
Administrator@DESKTOP-CKPKB5K MINGW64 /d/temp
$ awk -F ',' '{printf "set future:%s %s\n",$1,$2}' role.csv
set future:1702150998967975938 1
set future:1704318750462914562 1
set future:1704692754463825921 1
...
命令各部分的解析:
-
awk
:这是调用awk
程序的命令。 -
-F ','
:这个选项设置了字段分隔符为逗号(,
)。在awk
中,默认的字段分隔符是空格或制表符,使用-F
选项可以指定其他字符作为字段分隔符。在这个例子中,由于文件是 CSV 格式,逗号被用作字段之间的分隔符。 -
'{printf "set future:%s %s\n",$1,$2}'
:这是传递给awk
的命令或脚本。awk
将对role.csv
文件中的每一行执行这个脚本。printf
:这是一个格式化打印函数,用于按照指定格式输出文本。"set future:%s %s\n"
:这是printf
函数的格式字符串。%s
是字符串的占位符,\n
是换行符。$1
和$2
:这些是awk
的内置变量,代表当前行的第一个和第二个字段。在这个脚本中,$1
和$2
将被用作printf
函数的参数。
-
role.csv
:这是awk
要处理的文件名。
awk 生成批指令并且输出到文档
Administrator@DESKTOP-CKPKB5K MINGW64 /d/temp
$ awk -F ',' '{printf "set future:%s %s\n",$1,$2}' role.csv > role.redis.script.csv
使用> role.redis.script.csv
把输出重定向到role.redis.script.csv文件。
Administrator@DESKTOP-CKPKB5K MINGW64 /d/temp
$ cat role.redis.script.csv
set future:1702150998967975938 1
set future:1704318750462914562 1
set future:1704692754463825921 1
set future:1705054538352656386 1
...
redis-cli批量执行命令
/d/dev/Redis-x64-5.0.14.1/redis-cli -h you-host -a you-passowrd --no-auth-warning --pipe < role.redis.script.csv
这条命令使用了 redis-cli
工具,它是用于与 Redis 数据库交互的命令行界面。下面是对这条命令各部分的解析:
-
redis-cli
:这是 Redis 命令行工具的调用命令。 -
-h you-host
:-h
参数后面跟着的是 Redis 服务器的主机名或 IP 地址。在这个例子中,you-host
是占位符,应该替换为实际的 Redis 服务器地址。 -
-a you-password
:-a
参数后面跟着的是 Redis 服务器的密码。如果 Redis 实例配置了密码保护,这个参数是必需的。you-password
应该替换为实际的密码。 -
--no-auth-warning
:这个选项用于抑制认证警告。在使用密码连接时,Redis 可能会显示一些警告信息,使用这个选项可以避免这些警告信息的输出。 -
--pipe < role.redis.script.csv
:--pipe
选项允许redis-cli
从标准输入读取一系列 Redis 命令并执行它们。<
是一个 shell 重定向操作符,它将文件role.redis.script.csv
的内容作为标准输入传递给redis-cli
。 -
role.redis.script.csv
:这是包含 Redis 命令的文件。文件名中的.csv
扩展名表明它是一个逗号分隔值(CSV)格式的文件,但这里它可能只是一个命名约定,实际上文件可能包含一系列的 Redis 命令,每行一个。
综合来看,这条命令的作用是:使用 redis-cli
工具,通过指定的主机和密码连接到 Redis 服务器,并使用 --no-auth-warning
选项来抑制认证警告。然后,它通过 --pipe
选项从 role.redis.script.csv
文件中读取命令列表,并将这些命令作为输入传递给 redis-cli
执行。