awk print 的用法

 awk print 的用法
2012-02-09 11:00:14
标签: awk print  休闲  职场

1。AWK读取输入文件一次一行。
2。对于每一行,它匹配在给定的顺序模式,如果匹配,执行相应的动作。
3。如果没有模式匹配,将执行任何行动。
4。在上面的语法,无论是搜索模式,或行动是可选的,但不能同时。
5。如果没有给出搜索模式,然后awk要执行每一行输入给定的行动。
6。如果没有给出动作,打印,这是默认的操作与模式相匹配的所有行。
7。空出的任何行动括号什么都不做。它不会执行默认的打印操作。
8。中的每个行动的声明应该用分号分隔。


让我们创建employee.txt文件,其中有以下内容,这将是在使用
下文提到的例子。
$cat employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   DBA        Technology  $6,000

Awk的范例1。 awk的默认行为

默认情况下的awk打印文件的每一行。
 

$ awk '{print;}' employee.txt
100  Thomas  Manager    Sales       $5,000
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
400  Nisha   Manager    Marketing   $9,500
500  Randy   DBA        Technology  $6,000

 

在上面的例子中模式中没有给出。因此,是适用于所有的行。
action与任何参数的打印输出默认情况下,输出整行. 

Awk的范例2。打印与模式匹配的行。

$ awk '/Thomas/
> /Nisha/' employee.txt
100  Thomas  Manager    Sales       $5,000
400  Nisha   Manager    Marketing   $9,500


在上面的例子,它打印的“Thomas”或“Nisha”匹配的所有行。它有两种模式。

Awk的范例3。只打印特定的字段​​。

awk有内置的变量。对于每一个记录,即行,分隔空白字符分隔记录默认情况下,它存储在$ n个变量。如果该行有4个词,它会被存储在$ 1,$2,$ 3和$ 4。 $0表示整行。 NF是一个内置变量,它代表这一行有多少个被分隔的域.

$ awk '{print $2,$5;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000

$ awk '{print $2,$NF;}' employee.txt
Thomas $5,000
Jason $5,500
Sanjay $7,000
Nisha $9,500
Randy $6,000

Awk 范例4. 初始化and Final Action

Awk 两个重要的pattern , 由关键词 BEGIN and END 标识
 

Syntax: 

BEGIN { Actions}
{ACTION} # Action for everyline in a file
END { Actions }

# is for comments in Awk

这是一个例子

$ awk 'BEGIN {print "Name\tDesignation\tDepartment\tSalary";}
> {print $2,"\t",$3,"\t",$4,"\t",$NF;}
> END{print "Report Generated\n--------------";
> }' employee.txt
Name Designation Department Salary
Thomas Manager Sales          $5,000
Jason Developer Technology $5,500
Sanjay Sysadmin Technology $7,000
Nisha Manager Marketing $9,500
Randy DBA Technology $6,000
Report Generated
--------------



在上面的例子,它打印出的报告和最后文件的标题

Awk的范例6。打印技术部门的雇员列表。

部门名称现在​​是第四个字段,所以需要检查与“Techology”的字符串,如果$4 匹配,则打印这一行
$ awk '$4 ~/Technology/' employee.txt
200  Jason   Developer  Technology  $5,500
300  Sanjay  Sysadmin   Technology  $7,000
500  Randy   DBA        Technology  $6,000

操作符〜是正则表达式比较。如果匹配的默认操作,即打印整行.

Awk的范例7。打印在技术部门的雇员人数
下面的例子,  检查  department 是否是Technology, 如果是 则Action中,只增加变量的计数. 这个变量在BEGIN 中被初始化为0

$ awk 'BEGIN { count=0;}
$4 ~ /Technology/ { count++; }
END { print "Number of employees in Technology Dept =",count;}' employee.txt
Number of employees in Tehcnology Dept = 3
 


在END 中打印出这个变量,就是Technology 部门的员工数目
 

<think>我们正在讨论的是在Windows系统的OpenShell环境下使用awk进行print操作。首先需要明确,OpenShell(原Classic Shell)是一个用于增强Windows开始菜单的资源管理器扩展程序,它本身并不提供awk工具。因此,在Windows中使用awk需要额外安装。 在Windows中,可以通过以下几种方式使用awk: 1. 安装Cygwin:它提供了完整的类Unix环境,包括awk工具。 2. 安装GNUWin32或Gawk for Windows:这些是Windows平台的GNU工具包,其中包含awk(gawk)。 3. 使用Windows Subsystem for Linux (WSL):在Windows 10及以上版本中,可以安装WSL,然后在其中运行Linux发行版,从而使用awk。 无论采用哪种方式,安装完成后,awkprint命令使用方法与Linux/Unix环境下基本相同。 下面我们以通过Gawk for Windows为例,介绍在Windows OpenShell环境下(即命令行环境)使用awk进行print操作的方法和示例。 ### 安装Awk(Gawk)for Windows 1. 访问Gawk for Windows的官方网站(如:https://sourceforge.net/projects/gnuwin32/files/gawk/)下载安装包。 2. 安装并添加安装目录下的bin文件夹到系统环境变量PATH中。 安装完成后,打开命令提示符(CMD)或PowerShell,输入`gawk --version`,如果显示版本信息则表示安装成功。 ### Awk print的基本使用方法 在Windows命令行中使用awk(gawk)的print命令,语法与Linux中相同: ```bash gawk [选项] '模式 {动作}' [文件...] ``` 其中,`print`是最常用的动作之一。 #### 示例1:打印整个文件 假设有一个文件`data.txt`,内容如下: ``` Alice 25 Bob 30 Carol 28 ``` 打印整个文件: ```bash gawk "{print $0}" data.txt ``` 或者使用单引号(在PowerShell中,单引号和双引号都可以,但在CMD中单引号可能不被支持,因此建议在CMD中使用双引号,并将内部的双引号转义): 注意:在CMD中,整个awk命令应该使用双引号包裹,而内部的awk命令则使用单引号(如果包含空格或特殊字符,可能需要转义)。但为了简单,也可以在CMD中这样写: ```bash gawk "{print}" data.txt ``` #### 示例2:打印指定字段 打印每行的第一列和第三列(默认以空格分隔字段): ```bash gawk "{print $1, $3}" data.txt ``` 如果文件是以逗号分隔的(如CSV),则需要指定分隔符: ```bash gawk -F, "{print $1, $2}" data.csv ``` #### 示例3:使用条件打印 打印年龄大于26岁的行: ```bash gawk "$2 > 26 {print $0}" data.txt ``` #### 示例4:在BEGIN和END块中使用print 在开始处理前和结束后打印信息: ```bash gawk "BEGIN{print \"开始处理文件\"} {print $0} END{print \"处理结束\"}" data.txt ``` 注意:在Windows命令提示符中,双引号内的双引号需要使用反斜杠转义。 ### 在PowerShell中使用的注意事项 在PowerShell中,使用双引号时,变量(如$1)会被PowerShell解析,因此为了避免冲突,建议将awk的命令用单引号括起来,或者使用反引号`来转义$符号。 使用单引号包裹awk命令: ```powershell gawk '{print $1}' data.txt ``` 这样,$1就不会被PowerShell解释。 如果需要在awk命令中使用双引号,则需要在双引号前面加反引号(`")或者使用单引号包裹整个字符串并将其中的双引号转义。例如: ```powershell gawk "BEGIN{print `"开始`"} {print $1} END{print `"结束`"}" data.txt ``` ### 示例:处理Windows系统命令的输出 在Windows中,我们可以将其他命令的输出通过管道传递给gawk。例如,获取当前目录下的文件列表(使用dir命令),并打印文件名: ```cmd dir /B | gawk "{print \"文件名: \" $0}" ``` 在PowerShell中: ```powershell Get-ChildItem | Select-Object -ExpandProperty Name | gawk '{print "文件名: " $0}' ``` 注意:在Windows中,dir命令的输出是包含中文的,需要注意编码问题(通常为GBK)。如果gawk在处理时出现乱码,可能需要将输出转换为UTF-8编码,或者设置gawk的字符集环境变量。 由于gawk for Windows默认使用系统的ANSI编码(在中文Windows上是GBK),如果输入文件是UTF-8,则需要通过`-W`选项指定字符编码(如果支持的话)或者使用其他工具转换编码。 鉴于gawk for Windows(GNUWin32版本)可能不支持`-W`选项,一个替代方法是使用iconv进行编码转换,或者使用PowerShell的`Out-File`或`Set-Content`将输出保存为与gawk兼容的编码。 ### 总结 在Windows的OpenShell(命令行环境)中使用awkprint操作,需要先安装awk(如gawk)。安装后,其基本用法与Linux中的awk一致,但需要注意命令行的引号使用(在CMD和PowerShell中有所不同)以及编码问题。 下面给出一些常见用法的示例: 1. 打印文件内容: ```cmd gawk "{print}" data.txt ``` 2. 打印第一列和第三列(空格分隔): ```cmd gawk "{print $1, $3}" data.txt ``` 3. 指定逗号分隔符打印前两列: ```cmd gawk -F, "{print $1, $2}" data.csv ``` 4. 条件打印(第二列大于26): ```cmd gawk "$2>26 {print}" data.txt ``` 5. 结合管道处理其他命令的输出(以dir命令为例): ```cmd dir /B | gawk "{print \"File: \" $0}" ``` 6. 在BEGIN和END块中打印信息(注意转义双引号): ```cmd gawk "BEGIN{print \"Start\"} {print $0} END{print \"End\"}" data.txt ``` 在PowerShell中,为了避免$被解释,尽量使用单引号包裹awk命令。 注意:由于Windows和Linux在文本文件换行符(CRLF vs LF)上的差异,处理由Windows创建的文件时,gawk可以正常处理。但如果处理来自Linux的文件,则可能需要转换换行符。 §§相关问题§§ 1. 在Windows中使用awk处理中文时出现乱码怎么办? 2. 除了gawk,还有哪些适合Windows的文本处理工具? 3. 如何将awk脚本保存为文件并在Windows中运行? </think>### Windows系统OpenShell环境下awk print使用指南 Windows系统本身不支持awk,但在**OpenShell**(类Unix环境模拟器)中可通过安装兼容工具实现awk功能。推荐使用以下两种方案: --- #### 方案1:通过WSL使用awk(推荐) 若已启用**WSL (Windows Subsystem for Linux)**,可直接调用Linux版awk: 1. **安装WSL**:以管理员身份运行PowerShell并执行: ```powershell wsl --install ``` 2. **使用awk**: ```bash wsl awk '{print $1}' input.txt # 调用WSL中的awk打印第一列 ``` --- #### 方案2:安装Windows版Gawk 通过**[Gawk for Windows](https://sourceforge.net/projects/gnuwin32/)**原生支持: 1. **安装步骤**: - 下载`gawk-bin.zip`并解压 - 将`bin`目录加入系统`PATH`环境变量 2. **验证安装**: ```cmd gawk --version # 输出版本信息即成功 ``` --- ### awk print操作示例 #### 示例1:打印文件内容 ```cmd gawk "{print}" data.txt :: 打印全文(等效于cat) gawk "{print $1, $3}" data.txt :: 打印第1列和第3列 ``` #### 示例2:自定义分隔符 ```cmd :: 输入分隔符为逗号,输出分隔符为竖线 gawk "BEGIN{OFS=\"|\"} {print $1,$2}" -F, data.csv ``` 输出示例:`列1|列2` #### 示例3:条件筛选 ```cmd :: 打印第2列大于50的行 gawk "$2 > 50 {print $0}" data.txt ``` #### 示例4:处理命令输出 ```powershell Get-Process | gawk "$1 ~ /chrome/ {print $1, $2}" ``` 输出所有Chrome进程名和ID。 --- ### 关键注意事项 1. **路径问题**: - Windows路径需转换:`gawk "{print}" C:\\data.txt` 或 `/c/data.txt`(WSL路径) 2. **引号规则**: - CMD中使用**双引号**包裹awk命令:`gawk "{print $1}"` - PowerShell中改用**单引号**:`gawk '{print $1}'` 3. **性能建议**: - 大文件处理优先使用WSL(Linux内核效率更高) - 简单任务用`gawk`足够[^1] > **特殊场景**:处理含空格的路径时,使用`Get-Content`管道传递数据避免路径解析错误: > ```powershell > Get-Content "C:\复杂 路径.txt" | gawk "{print $1}" > ``` --- ### 常见问题解决 - **乱码问题**:文件编码需为UTF-8(用`chcp 65001`切换控制台编码) - **命令未找到**:检查`PATH`是否包含`gawk.exe`目录 - **权限不足**:以管理员身份运行OpenShell/CMD
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值