掌握awk实用教程:行处理与字段操作

需积分: 9 0 下载量 109 浏览量 更新于2024-07-16 收藏 313KB PDF 举报
awk是一个强大的文本处理工具,尤其适用于在数据流中进行复杂模式匹配和字段操作。它以文件的一行为处理单元,根据用户指定的规则逐行读取、解析和操作数据。本教程将详细介绍awk的基本语法、选项和命令结构,以及如何利用awk进行高效的文本处理。 **1. awk的语法基础** - **awk命令格式**: `awk [options] 'commands' files` - **选项(options)**: `-F`用于设置字段分隔符,如 `-F,` 或 `-F\t`,默认是空格或制表符。`-v`用于定义变量,可以从shell变量中引入,如 `-v var=value`。 - **命令(commands)**包括: - **读前处理** (BEGIN block): 在awk开始处理文件前执行的代码,如 `BEGIN {awk_cmd1;awk_cmd2}`。 - **行处理** (main block): awk的主要部分,通常包含定址命令、正则表达式匹配、变量引用和比较运算。例如,`if ($1 == "pattern") {print $2}`会检查第一列是否等于某个模式,并打印第二列。 - **定址命令**:包括正则表达式定址(如 `/^pattern/` 或 `/[\d]+$/`)、字段定址(如 `$1`, `$NF`)、变量定址(如 `$var`)等。 - **正则表达式**在awk中使用时,通常需要在其前后加上`//`,如`/regex/`。支持各种操作符,如`^`表示行首,`$`表示行尾,`.`匹配除换行符外的任何字符,`*`表示零个或多个前导字符,`[]`定义字符组。 **2. 字符串处理与正则表达式** - awk支持多种字符类,如 `[a-z]`匹配小写字母,`[A-Z]`匹配大写字母,`[0-9]`匹配数字。还可以通过`[^]`来排除字符组内的字符。 - `\<`通常用于匹配单词的开头,`word`会被视为一个单词,即使其中包含空格或其他特殊字符。 **3. 结合shell变量和预处理** - awk允许从shell传递变量,如 `-v var=expression`,这在需要动态配置的情况下非常有用。 awk是一个功能丰富的文本处理工具,其强大的模式匹配能力和灵活的字段操作使得它在数据分析、脚本编写和系统管理中扮演着重要角色。通过理解并掌握awk的语法和命令结构,你可以有效地处理复杂的文本数据,并将其转换成所需的形式。无论是简单的字段提取还是复杂的模式查找,awk都能胜任。

#!/bin/bash CPWD=$(cd $(dirname $0);pwd) cd $CPWD rm -f ssd_symbol_set hdd_symbol_set nvme_symbol_set filter_ssd_hdd_nvme_set() { rm -f ssd_symbol_set hdd_symbol_set nvme_symbol_set os_disk_symbol=$(echo $(lsblk |grep -B1 -E "part|boot" |grep -E "^sd[a-z]+|^nvme" |awk '{print $1}') |sed 's/ /|/') non_os_disk_set=$(lsscsi -g |-E "ATA|TOSHIBA" |awk '{print $(NF-1)}' |grep -Ev $os_disk_symbol) if [[ -n $non_os_disk_set ]];then for i in $(echo "$non_os_disk_set") do rotationRate=$(smartctl -i $i |awk -F":" '/Rotation Rate/{print $2}') if [[ $rotationRate =~ "Solid State Device" ]];then echo $i |awk -F"/" '{print $3}' >> ssd_symbol_set elif [[ $rotationRate =~ "rpm" ]];then echo $i |awk -F"/" '{print $3}' >> hdd_symbol_set fi done fi nvme_info_set=$(nvme list |grep -E "nvme[0-9]+n1") if [[ -n $nvme_info_set ]];then echo "$nvme_info_set" |awk '{print $1}' |awk -F"/" '{print $3}' > nvme_symbol_set fi } hdd_parallel_fio_test() { # multi hdd fio test if [ -s hdd_symbol_set ];then for dev in $(cat hdd_symbol_set) do nohup &>/dev/null bash hdd_raw_fio_test.sh $dev & done wait mkdir -p $CPWD/hdd_fio_log mv hdd_sd*_*.log $CPWD/hdd_fio_log fi } ssd_parallel_fio_test() { # multi sata ssd fio test if [ -s ssd_symbol_set ];then for dev in $(cat ssd_symbol_set) do nohup &>/dev/null bash ssd_raw_fio_test.sh $dev & done wait mkdir -p $CPWD/ssd_fio_log mv ssd_sd*_*.log $CPWD/ssd_fio_log fi } nvme_parallel_fio_test() { # multi nvme ssd fio test if [ -s nvme_symbol_set ];then for dev in $(cat nvme_symbol_set) do nohup &>/dev/null bash ssd_raw_fio_test.sh $dev & done wait mkdir -p $CPWD/nvme_fio_log mv ssd_nvme*_*.log $CPWD/nvme_fio_log fi } filter_ssd_hdd_nvme_set #hdd_parallel_fio_test #ssd_parallel_fio_test nvme_parallel_fio_test

2023-06-07 上传