awk linux 写文件
2014-10-30 21:32:05 fanghaobuzai 阅读数 266

合并file1和file2,除去重复项,结果写入file3:

awk 'NR==FNR{a[$0]=1;print}   

NR>FNR{                   

if(!(a[$0])) {print }     

}' file1.txt file2.txt > file3.txt


查询两个文件相同的部分

awk 'NR==FNR{a[$0]=1}           

NR>FNR{                   

if((a[$0])) {print }      

}' file1.csv file2.csv


删除空行

cat file1.txt |awk '{if(length!= 0) print $0}' > file2.txt


NR为主体行号,FNR为单位文件行号。



2019-01-11 14:08:00 weixin_34004576 阅读数 12

awk通常用来处理遵循一定格式的文件,例如/etc/passwd

域的概念

域是awk命令操作的基本单元,例如字符串user:name$0表示user:name$1表示user$2表示name。当然,此时的分隔符需要指定为:

echo "user:name" | awk -F : '{print $1,$2}' #输出“user name”

BEGIN/END模式

awk在对文件操作前和后可以增加额外操作,例如

echo "user:name" | awk -F : 'BEGIN{print "begin"} {print $1,$2} END{print "end"}'

默认变量

$0 $1 $2 - 分别表示全域、域1和域2;
NF - 当前行的域总数,需要注意分隔符;
NR - 当前行号;
FILENAME - 当前文件名;
FS/OFS - 分别表示输入分隔符和输出分隔符,需要-v选项;

常用选项

-F - 指定分隔符;
-v - 设置变量值,设置默认变量也需要使用这个选项;

条件判断

和C语言的条件判断格式类似。

# 统计/etc/passwd的行数
awk -F : 'BEGIN{line=0} {line++} END{print line}' /etc/passwd
或者
cat /etc/passwd | wc -l
# 打印第100行指定内容
awk -F : '{if(NR==100) print $1}' /etc/passwd
# 打印第10行内容
awk -F : 'BEGIN{line=0} {if(line==10){print $0;} line++}' /etc/passwd
# 打印前10行内容
awk -F : 'BEGIN{line=0} {while(line<10){print $0; line++}}' /etc/passwd

参考文献
Linux日常之命令awk - https://www.cnblogs.com/jiqianqian/p/7944013.html

2016-04-29 16:57:00 weixin_34074740 阅读数 4

一、什么是awk


awkLinux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等。他读取输出,或者文件的方式是一行,一行的读,根据你给出的条件进行查找,并在找出来的行中进行操作,感觉他的设计思想,真的很简单,但是结合实际情况,具体操作起来就没有那么简单了。他有三种形势,awkgawknawk,平时所说的awk其实就是gawk

二、awk命令格式和选项


·2.1 语法形式
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

·尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 awk在数据中查找的内容,而 action是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

·awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

·通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

·2.2 命令选项

-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:

-v var=value or --asign var=value
赋值一个用户定义变量。

-f scripfile or --file scriptfile
从脚本文件中读取awk命令。

-mf nnn and -mr nnn
nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;
-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

-W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

-W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息。

-W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明。

-W lint or --lint
打印不能向传统unix平台移植的结构的警告。

-W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。

-W posix
打开兼容模式。但有以下限制,不识别:\x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符****=不能代替^^=fflush无效。

-W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]

-W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用。

-W version or --version
打印bug报告信息的版本。

三、awk的正则


匹配符 描述
\Y 匹配一个单词开头或者末尾的空字符串
\B 匹配单词内的空字符串
< 匹配一个单词的开头的空字符串,锚定开始
> 匹配一个单词的末尾的空字符串,锚定末尾
\W 匹配一个非字母数字组成的单词
\w 匹配一个字母数字组成的单词
' 匹配字符串末尾的一个空字符串
\‘ 匹配字符串开头的一个空字符串

四、awk的函数


·4.1 字符串函数
函数名 描述
sub 匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的 时候
gsub 整个文档中进行匹配
index 返回子字符串第一次被匹配的位置,偏移量从位置1开始
substr 返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串
split 可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割
length 返回记录的字符数
match 返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位 置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串
toupper和tolower 可用于字符串大小间的转换,该功能只在gawk中有效
·4.2 数学函数
函数名 返回值
atan2(x,y) y,x 范围内的余切
cos(x) 余弦函数
exp(x) 求 幂
int(x) 取整
log(x) 自然对 数
rand() 随机数
sin(x) 正弦
sqrt(x) 平 方根
srand(x) x是rand()函数的种子
int(x) 取 整,过程没有舍入
rand() 产生一个大于等于0而小于1的随机数

五、入门实例


·假设last -n 5的输出如下

[root@www ~]# last -n 5 <==仅取出前五行
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

·如果只是显示最近登录的5个帐号

#last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root

·awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或[tab]键,所以$1表示登录用户,$3表示登录用户ip,以此类推。

·如果只是显示/etc/passwd的账户

#cat /etc/passwd |awk  -F ':'  '{print $1}'  
root
daemon
bin
sys

·这种是awk+action的示例,每行都会执行action{print $1}

-F指定域分隔符为':'

·如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割

#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh

·如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"

cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh

·awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

·搜索/etc/passwdroot关键字的所有行

#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

·这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。

·搜索支持正则,例如找root开头的: awk -F: '/^root/' /etc/passwd

·搜索/etc/passwdroot关键字的所有行,并显示对应的shell

# awk -F: '/root/{print $7}' /etc/passwd             
/bin/bash

这里指定了action{print $7}


参考文献:

http://man.lupaworld.com/content/manage/ringkee/awk.htm
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
http://www.codeweblog.com/awk命令-awk编程语言详细介绍和实例/

2016-04-29 16:57:00 weixin_34406796 阅读数 12

一、什么是awk


awkLinux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等。他读取输出,或者文件的方式是一行,一行的读,根据你给出的条件进行查找,并在找出来的行中进行操作,感觉他的设计思想,真的很简单,但是结合实际情况,具体操作起来就没有那么简单了。他有三种形势,awkgawknawk,平时所说的awk其实就是gawk

二、awk命令格式和选项


·2.1 语法形式
awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

·尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 awk在数据中查找的内容,而 action是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

·awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

·通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

·2.2 命令选项

-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:

-v var=value or --asign var=value
赋值一个用户定义变量。

-f scripfile or --file scriptfile
从脚本文件中读取awk命令。

-mf nnn and -mr nnn
nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;
-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

-W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

-W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息。

-W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明。

-W lint or --lint
打印不能向传统unix平台移植的结构的警告。

-W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。

-W posix
打开兼容模式。但有以下限制,不识别:\x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符****=不能代替^^=fflush无效。

-W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]

-W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用。

-W version or --version
打印bug报告信息的版本。

三、awk的正则


匹配符 描述
\Y 匹配一个单词开头或者末尾的空字符串
\B 匹配单词内的空字符串
< 匹配一个单词的开头的空字符串,锚定开始
> 匹配一个单词的末尾的空字符串,锚定末尾
\W 匹配一个非字母数字组成的单词
\w 匹配一个字母数字组成的单词
' 匹配字符串末尾的一个空字符串
\‘ 匹配字符串开头的一个空字符串

四、awk的函数


·4.1 字符串函数
函数名 描述
sub 匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的 时候
gsub 整个文档中进行匹配
index 返回子字符串第一次被匹配的位置,偏移量从位置1开始
substr 返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串
split 可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割
length 返回记录的字符数
match 返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位 置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串
toupper和tolower 可用于字符串大小间的转换,该功能只在gawk中有效
·4.2 数学函数
函数名 返回值
atan2(x,y) y,x 范围内的余切
cos(x) 余弦函数
exp(x) 求 幂
int(x) 取整
log(x) 自然对 数
rand() 随机数
sin(x) 正弦
sqrt(x) 平 方根
srand(x) x是rand()函数的种子
int(x) 取 整,过程没有舍入
rand() 产生一个大于等于0而小于1的随机数

五、入门实例


·假设last -n 5的输出如下

[root@www ~]# last -n 5 <==仅取出前五行
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

·如果只是显示最近登录的5个帐号

#last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root

·awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或[tab]键,所以$1表示登录用户,$3表示登录用户ip,以此类推。

·如果只是显示/etc/passwd的账户

#cat /etc/passwd |awk  -F ':'  '{print $1}'  
root
daemon
bin
sys

·这种是awk+action的示例,每行都会执行action{print $1}

-F指定域分隔符为':'

·如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割

#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh

·如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"

cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh

·awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

·搜索/etc/passwdroot关键字的所有行

#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

·这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。

·搜索支持正则,例如找root开头的: awk -F: '/^root/' /etc/passwd

·搜索/etc/passwdroot关键字的所有行,并显示对应的shell

# awk -F: '/root/{print $7}' /etc/passwd             
/bin/bash

这里指定了action{print $7}


参考文献:

http://man.lupaworld.com/content/manage/ringkee/awk.htm
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
http://www.codeweblog.com/awk命令-awk编程语言详细介绍和实例/

2011-05-18 10:11:00 wensishuai 阅读数 2019

首先描述一下这个问题:比如两个文件file1和file2,删除两个文件中共同的部分,留下两个文件中独自有的部分。在网上找到一篇解决的答案,地址在这里http://hi.baidu.com/robertoyuan/blog/item/559483c4946ed5a78226acac.html。这里提到三种方法,但是没有给具体的解释。

 

  1. 方法一:使用grep
grep -v -f file1 file2 && grep -v -f file2 file1 

grep命令的详细使用方法,可以参考man,这里有一个简单实用的介绍:http://linux.ccidnet.com/art/3067/20070313/1035613_1.html。在方法一中,用到了两个参数。参数-v,表示invert match,即反向匹配,输出没有匹配上的项。参数-f,表示从文件中读取匹配模板(pattern)。方法一中的前一部分,在文件file1中匹配模板,来反向匹配文件file2中的内容,即输出文件file2中,在file1中没有的内容。后面的一部分同理可得,输出文件file1中,在file2中没有的内容。

  1. 方法二:实用comm 
comm -3 file1 file2

这个方法看起来最简单。命令comm的功能就是,逐行比较两个排好序的文件,默认输出有三列:只在file1中有的行、只在file2中有的行、在file1和file2中共有的行。有参数-1 -2 -3,分别来抑制输出对应的列。例如在我们的方法二中,实用-3参数,不输出file1和file2中共有的部分。即能达到我们本文的目的。
但是注意到,comm比较排好序的两个文件,comm在处理文件的时候,首先要查看文件是否有序,例如file1和file2的内容如下:

$cat file1
line1
line2
line3 

$cat file2
line0
line1
line3
line2

调用前面方法二的命令的时候,就会提示file2文件时无序的,输出的结果如下:

$ comm -3 file1 file2
        line0
line2
comm: file 
2 is not in sorted order
        line2

如果使用--nocheck-order参数,不进行有序性检测,结果如下:

$ comm -3 --nocheck-order file1 file2

        line0
line2

        line2

 从这个结果中我们可以看到,这还是不是我们真正想要的结果。这里可体现comm的另一个特征,就是逐行比较。它是对file1和file2进行逐行往下的比较,检测是否相同。所以,在用comm的时候,要根据具体的情况进行分析了。 

 

  1. 方法三:使用awk
awk '{print NR, $0}' file1 file2 |sort -k2|uniq -u -f 1|sort -k1|awk '{print $2}'
或者:
awk '{
print $0}' file1 file2 |sort|uniq -u

awk命令的使用,听牛人说可谓博大精深,我也没有太搞清楚。这里只是使用了一些简单的功能。下面以我自己的理解来解释一下上面的shell代码。awk就是文本的解释器和过滤器。awk把每一行看成是一个记录(record),每个记录使用分隔符(默认是空格)把每条记录分成若干域。awk内置参数$0表示整行,$1、$2...分别表示各域,内置参数NR,表示记录的计数,awk '{print NR, $0}' file1 file2表示依次读取file1 file2,打印出每行,并且在前面添加行号。

 命令sort,就是对行进行排序,参数-k表示根据各行的第几个参数关键字开进行排序,这里的-k2表示根据第二个关键字开始进行排序。

命令uniq,进行报告或者忽略重复的行,参数-u,表示只是打印出唯一的行(unique lines),-f表示忽略的每行的前n个域的比较。

Linux 文件比较(grep/comm/awk)

阅读数 1135

http://www.flatws.cn/article/program/shell/2011-05-19/26444.html

博文 来自: caoeryingzi

linux 之cut awk 和批量文件编码转换 shell脚本

阅读数 1337

今天的脚本是为了实现一个功能有一个线上服务器,需要在web界面调用shell脚本,实现一键下载选定图片的功能。并且要求是用户下格式和编码方式通用,不会出文件载下来的格式未知和乱码的现象。基本思路:web应用传递用户选择的图片参数,通过执行shell脚本后跟用户所选参数,实现用户需求传入,在shell里面实现图片压缩和格式转换。(利用shell$1的参数原理,加上cut和awk处理

博文 来自: u012083220

Linux处理格式化文件(awk、sort等)

阅读数 305

目前有这样的一些数据,获取按照‘‘|’’分隔,按照第二列求第三列的和并按照和降序排序取前10数据#用'|'分隔,按照第三列数值降序排序取前10catpart-r-0000*|sort-t"|"-k3rn|head-10#获取按照'|'分隔,按照第二列求第三列的和=&gt;取和不为0的=&gt;按照和降序排序=&gt;取前10cat./*|awk-F...

博文 来自: csdnmrliu

Linux Shell 脚本应用——awk文本处理文件

阅读数 742

1、关于文本处理2、awk基本命令格式3、常见用法

博文 来自: xuanguqiufeng

[Linux](十二) --文件格式化处理awk,sed,printf

阅读数 125

今天学习了下文件格式处理一般常用的三个命令。1.printf:格式化打印printf和C语言里面的printf差不多。格式:printf‘打印格式’打印内容参数:\f:清楚屏幕\n:换行\t:水平的tab\v:垂直的tab例子1:发现一对单引号里面是算一个字段,对应一个%s。像这样就全部放在单引号里面,就直接...

博文 来自: qq_36659627
没有更多推荐了,返回首页