【sed / awk脚本编写】
awk
awk分为BEGIN部分,正则匹配部分,END部分三部分。
我一般在BEGIN部分定义一些变量,正则部分用于匹配和执行一些解析和统计,END部分用于输出结果。
总体结构:
awk 'BEGIN{xxxx;xxxx;}{xxxx;xxxx;} /匹配字符串/{xxxx;xxxx;} END{xxxx;xxxx;}' 待处理的输入文件
或
其他命令的结果 | awk 'BEGIN{xxxx;xxxx;}{xxxx;xxxx;} /匹配字符串/{xxxx;xxxx;} END{xxxx;xxxx;}'
示例一:
抓取网页test.html中的身份证号/手机号,输入:一个html文件,输出:一行:网页url 身份证号个数 手机号个数 找到的身份证号 找到的手机号
cat test.html | sed -e 's/\(^\|[^0-9]\)\(13[0-9][0-9]\{8\}\|14[579][0-9]\{8\}\|15[0-3,5-9][0-9]\{8\}\|16[6][0-9]\{8\}\|17[0135678][0-9]\{8\}\|18[0-9][0-9]\{8\}\|19[89][0-9]\{8\}\)\($\|[^0-9]\)/\nfind_phone:\2\n/g' | sed -e 's/\(^\|[^0-9]\)\([0-9]\{6\}[1-2][0-9]\{3\}\(\(0[1-9]\)\|\(10\|11\|12\)\)\(\([0-2][1-9]\)\|10\|20\|30\|31\)[0-9]\{3\}[0-9Xx]\)\($\|[^0-9]\)/\nfind_idcard:\2\n/g'| awk 'BEGIN{OFS=":";idcard_count=0;phone_count=0;}/Url/{if(NR<10) {url=$3;}}/find_phone/{phone_count++;phone_list[phone_count]=$1;}/find_idcard/{idcard_count++;idcard_list[idcard_count]=$1;}END{if(idcard_count!=0||phone_count!=0){printf "%s",url;for(i=0;i<length(url)/7;i++){printf "\t"};printf "%d\t%d\t",idcard_count,phone_count;for(i=1;i<=phone_count;i++){printf phone_list[i];printf "\t";};for(i=1;i<=idcard_count;i++){printf idcard_list[i];printf "\t";};print "";}}'
示例二:
num.txt: 加法: cat num.txt | awk '{sum += $1} END {print sum}'
輸出:
示例三:输入:示例一的输出 输出:url 是否有身份证号 是否有手机号 1条匹配到的身份证 1条匹配到的手机号
运行命令:
输出到文件
[spider@]$ cat sample1.output | sh test_filter.sh > sample3.output
输出到控制台用less查看
[spider@]$ cat sample1.output | sh test_filter.sh | less
less命令:
less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键。 #!/bin/bash awk '{
id_num=;
phone_num=;
temp_id="NULL";
temp_phone="NULL";
for(i=;i<NF;i++){
if($i~/find_phone/) {
phone_num++;
temp_phone=$i;
}
if($i~/find_idcard/) {
if(!($i~/find_idcard:/)) {
id_num++;
temp_id=$i;
}
}
} if(id_num>){
has_id="true"
}else{
has_id="false"
}
if(phone_num>){
has_phone="true"
}else{
has_phone="false"
} print substr($,,length($)-)"\t"has_id"\t"has_phone"\t"temp_id"\t"temp_phone
}' | awk '{
if($!="NULL" && ($=="true" || $=="true")) {
print $
}
}'
用substr函数切掉url字符串的最后一个^M字符,防止输出时覆盖
1、使用过程中难点主要是对不同行做不同的解析和输出处理:
http://bbs.chinaunix.net/thread-4186958-1-1.html
2、
awk '{print NR}' filename; //打印行号
awk ‘{print $0}' filename; //打印整行
3、if语句
[chengmo@localhost nginx]# awk 'BEGIN{
test=;
if(test>)
{
print "very good";
}
else if(test>)
{
print "good";
}
else
{
print "no pass";
}
}' very good
更多的if/for/while/do操作:
https://www.cnblogs.com/chengmo/archive/2010/10/04/1842073.html
4、awk的变量(包括数组)不需要声明可以直接使用
https://www.cnblogs.com/pangbing/p/7015745.html
5、awk中判断字符长度: length(变量名)
http://bbs.chinaunix.net/thread-271694-1-1.html
6、查询文件行数
[spider@zhangsuosheng]$ cat test2.html
dddd
bbb131102198910084421ccc eee13611112222fff13133334444
h15855556666j
aaaa [spider@zhangsuosheng]$ cat test2.html |awk 'BEGIN{counter=0;}{counter++;}END{print counter;}'
sed
利用sed将文件中每一行复制十遍
sed 's/\(.*\)/\1\n\1\n\1\n\1\n\1\n\1\n\1\n\1\n\1\n\1/g' > ${file}
将上一级目录中的1.txt 2.txt 3.txt 4.txt 几个文件每行复制十遍写入当前目录的对应文件中
shell数组遍历 黄色底色
shell 字符串拼接 红字
sed 提取匹配到的部分,用\( \)扩出来要提取的,用\1 \2提取这些括号中匹配到的
#!/bin/bash file_list=('1.txt' '2.txt' '3.txt' '4.txt' ) for file in ${file_list[@]}
do
temp='../'${file}
cat ${temp} | sed 's/\(.*\)/\1\n\1\n\1\n\1\n\1\n\1\n\1\n\1\n\1\n\1/g' > ${file}
../data_tools shuffle -if1 ${file} -of1 ${file}
done
利用sed命令在匹配某特定字符串的行尾添加字符串
shortest match by default
把txt文件中包含test行的行尾添加 ‘000’
sed -i '/test/ s/$/000/'
【sed / awk脚本编写】的更多相关文章
- AWK 脚本编写习惯
教训总结: 不能忽略了脚本语言的编写规范! 创建数组的时候初始化,特别是在for循环中使用的数组: u_count[; g_count[; 认真对待对象,特别是数组的命名: username_to_d ...
- Shell awk文本处理,shell脚本编写
Shell awk文本处理,shell脚本编写 一:内容包含awk.变量.运算符.if多分支 <a>语法糖: awk [options] 'commands' files option - ...
- shell脚本编写方法
shell脚本编写就如同一门语言,涉及到运行环境.基本语法.变量定义.函数.参数(系统参数).条件判定.执行流程控制 等等问题. 本文就以下几个方面进行描述: 运行环境: shell shebang ...
- 一个很不错的bash脚本编写教程
转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Lin ...
- shell脚本编写笔记
包含转载内容,转载自http://wenku.baidu.com/link?url=jtCHxEYzgGve6P64U3JRQRgU6nhpGvqFLLpWu9I2Htq6hi9TGLudRFkk7r ...
- linux 脚本编写基础(一)
1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在 ...
- linux sed awk seq 正则使用 截取字符 之技巧
[root@room9pc01 ~]# seq 5 1 2 3 4 5 [root@room9pc01 ~]# seq 2 5 2 3 4 5 seq 1 2 10 1 3 5 7 9 [root@d ...
- shell 脚本编写基础
在进行Linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入 ./smartzip就能运行脚本了.. 每行 ...
- Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)
I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量 env:环境变量 常用系统变量: path pwd lang home his ...
随机推荐
- Atitit.导出excel功能的设计 与解决方案
Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...
- [svc]msmtp+mutt发附件,发邮件给多个人
环境:centos6.7 x86-64 内网有web服务器(curl可展示目录) #预安装软件 yum install lrzsz ntpdate sysstat dos2unix wget teln ...
- jquery几个按钮同时调用一个方法
- linux学习笔记30--命令at和crontab
在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...
- 飞思卡尔烧写工具mfgtools的使用
MFGTool是飞思卡尔提供的烧写工具,使用起来非常方便.但是,在使用MFGTool有几点是需要注意的,否则就会在烧写过程中遇到一些问题: 1.在使用MFGTool前,文件cfg.ini 和 UICf ...
- python通过日志分析加入黑名单
监控nginx日志,若有人攻击,则加入黑名单,操作步骤如下:1.读取日志文件2.分隔文件,取出ip3.将取出的ip放入list,然后判读ip的次数4.若超过设定的次数,则加入黑名单 日志信息如下: 1 ...
- python笔记2-数据类型:元组、字典常用操作
元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. tp=(1,2,3,'a','b' ...
- 数据库设计——E-R图
一,复习下基础 1.弱实体 这样的实体须要依赖还有一个实体.若还有一个实体不存在了.它也随之消失.相对而言,它依赖的那个实体成为强实体. 2,特殊化 在数据库设计的过程中,我们会发现.一个实体能够依照 ...
- Linux严格区分大小写
虚拟机上安装了MySQL,使用rpm -qa | grep mysql查询时却未找到安装的mysql,后面才发现Linux严格区分大小写,正确的查询命令应该为rpm -qa | grep MySQL, ...
- Android无线测试之—KEYCODE键值对应大全
KEYCODE列表电话键键名 描述 键值 KEYCODE_CALL 拨号键5 KEYCODE_ENDCALL 挂机键6 KEYCODE_HOME 按键Home3 KEYCODE_ME ...