hxdtest / linuxshell

0 stars 0 forks source link

AWK #3

Open hxdtest opened 4 months ago

hxdtest commented 4 months ago

awk -F 是什么含义

awk是一个非常强大的文本处理工具,它允许你写出简短的程序来处理文本文件。在awk命令中,-F选项用于指定输入字段(即在处理文本行时,数据字段之间的分隔符)的分隔符。

默认情况下,awk使用空格作为字段分隔符,这意味着它将根据空格将每行文本分割成多个字段。但是,如果你的数据字段是由特定字符分隔的,比如逗号(,)、冒号(:)或任何其他字符,你可以使用-F选项来指定这个字符作为字段分隔符。

例如,如果你有一个逗号分隔的文件(常见于CSV格式的文件),你可以使用-F,来告诉awk使用逗号来分隔字段:

awk -F, '{print $1, $2}' myfile.csv 这个命令将打印每一行的第一个和第二个字段,字段之间是由逗号分隔的。

另一个例子,如果你想处理一个由冒号分隔的文件(比如Linux的/etc/passwd文件),你可以这样做:

awk -F: '{print $1, $7}' /etc/passwd 这会打印出每一行的第一个字段(通常是用户名)和第七个字段(通常是用户的shell)。

简而言之,-F选项在awk中用来指定输入行的字段分隔符,允许你轻松地处理各种格式的文本文件。

hxdtest commented 4 months ago

END {

打印所有找到的目录

for (dir in dirs) print dir

}' 是awk脚本的一部分,它用于在处理输入行结束后执行一段特定的代码块。在这个情况下,“输入行”指的是find命令找到的、通过管道传递给awk命令的所有.png文件的路径。

awk程序由多个模式及相应的动作组成,每个模式都是一个条件或范围(例如,在处理文件的特定行时),而相应的动作则是一段在模式匹配时将被执行的代码。特别的,END模式是在所有的输入行都被处理完后执行的。因此,它是用于执行一些后处理或总结性的操作。

这段awk脚本的END代码块含义如下:

当所有的输入行(即所有.png文件的路径)都以逐行的形式被awk处理之后,awk会执行END代码块中的命令。 dirs是一个在之前代码中创建的关联数组,用于存储含有.png文件的目录路径(通过去除每个文件路径的文件名部分来获取)。由于它是一个关联数组,每个唯一的目录路径只存储一次,即使该目录中有多个.png文件也是如此。 for (dir in dirs) print dir是一个for循环,遍历dirs数组中的每个元素(即每个目录路径),并使用print dir将其打印到标准输出。 简而言之,这段代码的作用是,在处理了当前目录及其所有子目录下找到的所有.png文件之后,将找到至少一个.png文件的唯一目录路径打印出来

hxdtest commented 4 months ago

使用shell脚本写,过滤当前目录下有png文件类型的文件夹,

GPT4_Turbo_128K 在Shell脚本中查询当前目录下含有PNG文件的文件夹并打印出这些文件夹的名称可以通过结合使用find和awk命令来实现。以下是一个简单的Shell脚本示例:

!/bin/bash

找出当前目录及子目录下所有的png文件

然后使用 awk 命令提取其目录路径

find . -type f -iname "*.png" | awk -F/ '{

移除文件名,仅保留目录路径

$NF="";
dir=$0;

# 移除行尾的空格 (因为移除文件名后会留下一个空格)
gsub(/ $/, "", dir);

# 使用关联数组去除重复的目录
dirs[dir]

}

END {

打印所有找到的目录

for (dir in dirs) print dir

}' 这个脚本做了以下几步操作:

使用find . -type f -iname "*.png"从当前目录(.)开始,递归查找所有扩展名为.png(忽略大小写由-iname选项指定)的文件。 通过管道(|)将find命令的输出传给awk命令。 在awk命令中,我们将每行(代表一个找到的PNG文件路径)分割成数组(由-F/定义的分隔符是/),移除文件名(即数组的最后一个元素),然后去除末尾的空格,并使用一个关联数组来去除重复的目录。 在awk的END{}代码块中,我们遍历关联数组并打印每个目录路径。 请注意,这个脚本可能会打印出相对路径(如./folder),这取决于你运行脚本时的当前工作目录。

要运行这个脚本:

首先保存这段代码到一个文件中,比如命名为find_png_dirs.sh。 赋予文件执行权限,通过在终端运行chmod +x find_png_dirs.sh。 在终端中运行脚本:./find_png_dirs.sh。 这将列出当前目录及其子目录中,包含至少一个.png文件的所有文件夹。

hxdtest commented 4 months ago

NF="";是什么含义

GPT4_Turbo_128K 在 awk 中,$NF="" 这行代码的意思是将当前行的最后一个字段的值设置为空字符串。这里,$NF 代表当前行的最后一个字段(Field),而 NF 是 awk 内置的一个变量,代表当前行的字段总数(Number of Fields)。因此,$NF 就是获取当前行的最后一个字段。

通过设置 $NF="",你实际上是在删除最后一个字段的内容,但需要注意,这并不会改变 NF 的值,即字段的总数仍是原来的数目,只是最后一个字段的内容变为了空。

例如,假设你有一行文本如下:

This is a test line 如果使用 awk 并设置了 $NF="",则最后一个字段(line)的内容会被删除,但原行中字段的数量(NF)仍为4,只是最后的line现在变为空字符串。

一个实际的使用示例,在处理文本或数据时,可能会用到这个操作来忽略行尾的特定字段。这是一个基于之前讨论的示例,展示如何使用 $NF="":

echo "This is a test line" | awk '{$NF=""; print}' 这将输出:

This is a test 注意在输出中,最后的单词(line)已经被移除,就像我们通过将 $NF 设为空来预期达到的效果。这种技巧在需要忽略特定字段内容,但又不想改变原有字段布局时非常有用。

17.6s · 5757tokens

dir=$0;是什么意思

GPT4_Turbo_128K 在 awk 程序中,dir=$0; 这行代码的作用是将当前处理的完整输入行的内容赋值给变量 dir。

让我们分步解释这个表达式的各个部分:

dir 是一个由用户定义的变量名,在这个上下文中被用来存储每一行的内容。在 awk 中,你可以自由地命名变量,并在程序中使用它们。

= 是赋值操作符,用于将右侧表达式的值赋给左侧的变量。

$0 是 awk 中的一个特殊变量,代表当前行的完整内容。awk 将输入文本拆分成多行处理,每一行都可以通过字段访问(比如 $1 表示当前行的第一个字段,$2 表示第二个字段,依此类推),而 $0 则包含了整行的文本。

因此,dir=$0; 这行代码的意思就是,“将当前处理的整行文本赋值给变量 dir”。

这个操作在你需要保留原始行内容进行进一步处理时非常有用。例如,你可能需要基于整行内容做一些筛选、替换或格式化等操作。通过将 $0 的值赋给一个变量,你就可以在 awk 程序的后续部分方便地使用这些原始文本数据。

20.9s · 5633tokens

gsub(/ $/, "", dir); 是什么意思?

GPT4_Turbo_128K 在 awk 中,gsub() 函数用于进行全局的搜索和替换操作。具体来说,gsub(/ $/, "", dir); 这行代码的作用是移除变量 dir 中所有行尾的空格字符。这里我们来分解这个命令的组成部分以便更好地理解它:

gsub(regex, replacement, target) 是 awk 内置的全局搜索和替换函数,其中:

regex 是要匹配的正则表达式模式。 replacement 是用来替换掉匹配到的文本的字符串。 target 是包含要搜索文本的变量名。gsub 将在这个变量指向的文本中进行查找和替换操作。 / $/ 是正则表达式,其中:

空格 (space) 是要匹配的字符,这里指一个空格字符。 $ 是正则表达式中的一个锚点,表示字符串的末尾。 所以,/ $/ 匹配的是字符串末尾的任何空格字符。 "" 为空字符串,表示将匹配到的文本替换为空,即删除它。

dir 是上文中通过 dir=$0; 定义的变量,存储了当前处理行的内容。

综上所述,gsub(/ $/, "", dir); 这行代码会移除变量 dir 中存储的文本末尾的所有空格字符。这是一种常见的文本清理手段,用于在进一步处理前确保文本格式的整洁。

例如,如果有一个字符串 dir 的值为 "Hello World " (注意末尾的空格),执行 gsub(/ $/, "", dir); 后,dir 的值将变为 "Hello World",即末尾的空格被成功移除。