`
qindongliang1922
  • 浏览: 2148366 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:116345
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:124613
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:58491
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:70379
社区版块
存档分类
最新评论

shell脚本杂记(三)

阅读更多
1,我们先来熟悉下正则表达式一些字符含义的基础
^行起始标记
$行尾标记
.匹配任意一个字符
[]匹配包含在[]之中的任意一个字符
[^]匹配除[^字符]之外的任意一个字符 9[^01],可以匹配92,93不会匹配90,91
[-]匹配指定范围内的字符,[1-8]匹配1-8之内的任意一个字符
?匹配0次或1次
+匹配1次或多次
*匹配0次或多次
()创建一个匹配的字串
{n}匹配n次
{n,}至少n次
{n,m}n和m之间
|或关系的匹配 ba(r|t)可以匹配bar和bat
\转义字符a\.b匹配a.b

2,grep命令用法:
grep pattern filename  单个文件
grep pattern file1 file2 file3 ...  多个文件
egrep "[a-z]+" file 扩展的正则
egrep -o "[a-z]" 只输出匹配部分
grep -v pattern file 匹配结果反转
grep -c patter file 匹配行数

递归搜索在多级目录里搜索文件:
grep "text" . -R -n

忽略大小写
grep -i "helloW"

匹配多个样式
grep -e "this"  -e "key" -o

在搜索里排除,或指定文件
grep "main" . -r --include *.{c,cpp}
grep "main" . -r --exclude *.{c,cpp}

打印匹配之后的行:
[root@ganglia 916]# seq 10 | grep 5 -A 2
5
6
7
[root@ganglia 916]# 


匹配结果前2行
[root@ganglia 916]# seq  10 | grep 5 -B 2
3
4
5
[root@ganglia 916]# 



匹配结果前后2行
[root@ganglia 916]# seq 10 | grep 5 -C 2
3
4
5
6
7
[root@ganglia 916]# 


3,使用cut命令,cut命令是用来切分分文件的,很容易的按列切分

1,提取特定的字符 cut -f filed_list filename
例如: cut -f 2,3 filename

[root@ganglia 916]# cut -f1 -d" " a.txt 
name
zhang
wang
li
[root@ganglia 916]# 

-d后面指定定界符
-f后面多个数字使用逗号隔开

[root@ganglia 916]# cut -f1,3 -d" " a.txt 
name score
zhang 100
wang 99
li 96
[root@ganglia 916]# cat a.txt 
name mark score
zhang 20 100
wang 36 99
li 12 96
[root@ganglia 916]# 




其他用法:
N- 从第N个字节,字符或字段到行尾
N-M 从第N个字节到第M个字节
-M 从第一个字节到第M个字节

-b表示字节
-c表示字符
-f用于定义字段



打印前5个字符:
[root@ganglia 916]# cat b.txt 
aafgdfdfdfdsfd
dffdsfag12343r3
fdfdfdgfgfgf
dfdgdtrasf
zzzzzzzz
ddfdfggdfdf
[root@ganglia 916]# cut -c1-5 b.txt 
aafgd
dffds
fdfdf
dfdgd
zzzzz
ddfdf
[root@ganglia 916]# 


打印前2个字符:
[root@ganglia 916]# cut b.txt -c -2
aa
df
fd
df
zz
dd
[root@ganglia 916]# 


提取多个字段输出:

[root@ganglia 916]# cut b.txt  -c1-3,4-6 --output-delimiter "====>"   
aaf====>gdf
dff====>dsf
fdf====>dfd
dfd====>gdt
zzz====>zzz
ddf====>dfg
[root@ganglia 916]# 



4,使用sed命令
替换命令sed 's/pattern/replace/' file
替换原始文本 sed -i 's/pattern/replace/' file
替换所有目录sed -i 's/pattern/replace/g' file
移除空白行 sed '/^$/d' file
已匹配字符串标记,这个功能,做高亮最适用了:


[root@ganglia 916]# echo "i am a red cat" | sed 's/red/\<bold\>&\<\/bold\>"/g'
i am a <bold>red</bold>" cat
[root@ganglia 916]# echo "i am a red cat" | sed 's/red/"&"/g'                
i am a "red" cat
[root@ganglia 916]#

多个表达式命令: sed -e "pattern1" -e "pattern2"

在shell里面向sed里,传变量
[root@ganglia 916]# text=hello
[root@ganglia 916]# echo hello world | sed "s/$text/big/"
big world
[root@ganglia 916]# 


5,使用awk编程

基本语法: awk 'BEGIN {print "start"} pattern {commonds} END {print "end"}  ' files

注意awk的脚本,也可以用双引号括住
如下例子:
awk "BEGIN {i=0} {i++} END {print i}" filename
[root@ganglia 916]# echo -e "1\n2\n3" | gawk 'BEGIN {print "开始" } {print} END {print "结束"} '
开始
1
2
3
结束
[root@ganglia 916]#


需要记住两点,print打印的参数是逗号分割的,默认空格是定界符 双引号,会被当做拼接符号

NR 记录数量,相当于当前行号
NF 字段数量,执行过程中当前字段数
$0 原始内容
$n 第n列


[root@ganglia 916]# cat a.txt 
name mark score
zhang 20 100
wang 36 99
li 12 96
[root@ganglia 916]# gawk '{ print $1, $3}' a.txt 
name score
zhang 100
wang 99
li 96
[root@ganglia 916]# 


打印行号,统计行数
[root@ganglia 916]# gawk '{ print NR }' a.txt        
1
2
3
4



读取一行使用getline
[root@ganglia 916]# seq 6 | gawk 'BEGIN {getline; print "第一行:" $0} {print $0}'
第一行:1
2
3
4
5
6
[root@ganglia 916]# 


注意,这个例子,可以用来读取带表头的excel或者一些文本数据非常方便


awk的灵活的过滤条件
awk 'NR < 5' 行号小于5的行
awk 'NR==1,NR==4' 行号在1到5之间的行
awk '/linux/' 包含linux的行
awk '!/linux/' 不包含linux的行

设置字段定界符:
awk -F: '{ print $NF}' /etc/passwd

awk支持循环:
[root@ganglia 916]# gawk  'BEGIN{ for (i=0;i<=10;i++){ print i  } }'
0
1
2
3
4
5
6
7
8
9
10
[root@ganglia 916]# 

跟我们所学的C和JAVA还是JavaScrpit都非常接近

awk内置函数
length()字符串长度
index()返回出现位置
split()打散一个数组
substr()截取一个字符串
sub() 替换
match()匹配




6,按列合并多个文件

[root@ganglia 916]# cat c.txt 
1
2
3
4
[root@ganglia 916]# cat d.txt 
a
b
c
d
e
[root@ganglia 916]# pas
passwd  paste   
[root@ganglia 916]# pas
passwd  paste   
[root@ganglia 916]# paste c.txt  d.txt 
1       a
2       b
3       c
4       d
        e
[root@ganglia 916]# 


指定分割符:
[root@ganglia 916]# paste c.txt  d.txt -d ","      
1,a
2,b
3,c
4,d
,e
[root@ganglia 916]# 


截取指定范围字符
[root@ganglia 916]# seq 100 | gawk 'NR==4,NR==10'
4
5
6
7
8
9
10
[root@ganglia 916]# 


逆序输出tac
[root@ganglia 916]# seq 5 | tac
5
4
3
2
1
[root@ganglia 916]# 


逆序输出awk
[root@ganglia 916]# seq 5 | gawk '{ lifo[NR]=$0 } END{ for(lno=NR;lno>-1;lno--){print lifo[lno]} } ' 
5
4
3
2
1

[root@ganglia 916]# 





0
2
分享到:
评论

相关推荐

    LinuxShell脚本学习基础视频

    资源名称:Linux Shell脚本学习基础视频资源目录:【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_...

    Shell脚本中获取进程ID的方法

    我该如何在shell脚本中得到PID。 当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要...

    shell 脚本shell 脚本shell 脚本

    shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本shell 脚本

    Linux_shell脚本全面学习

    Linux_shell脚本全面学习 Linux_shell脚本全面学习

    250个shell脚本

    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来...

    Shell脚本编程100例

    Shell脚本编程100例。 融汇 shell 脚本知识点,集大成之作。 本书实在是学习、进修、面试、居家旅行必备精品!

    shell脚本写的加密脚本

    学习shell脚本,了解linux知识。

    python编写shell脚本

    python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本python编写shell脚本

    Shell脚本专家指南

    Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...

    109个shell脚本合集.pdf

    109个shell脚本合集.pdf

    shell脚本shell脚本shell脚本

    shell脚本shell脚本shell脚本

    Linux_Shell脚本攻略.第3版

    Linux_Shell脚本攻略.第3版,高清电子版,作者Clif Flynt,Sarath Lakshman,Shantanu Tushar. 这本书的电子版也可以到http://readfree.me这个网站上下载。

    Linux-shell脚本全面学习.pdf

    Linux-shell脚本全面学习.pdf

    提高cpu利用率的shell脚本

    需要提高cpu利用率的shell脚本

    输出执行操作和打印日志的shell脚本实例

    cat /mnt/log_function.sh #!/bin/bash #log function ####log_correct函数打印正确的输出到日志文件 function log_correct () { DATE=`date “+%Y-%m-%d %H:%M:%S”` ####显示打印日志的时间...log_error打印shell脚本

    shell 脚本 实例 shell 脚本 实例

    参考shell脚本实例.rar参考shell脚本实例.ra参考shell脚本实例.rarr

    IDEA中编写并运行shell脚本的实现

    主要介绍了IDEA中编写并运行shell脚本的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    linux下shell脚本实现数据的导出

    第一次接触linux系统,之前写的数据导出不好使了。...找了好多资料,最后决定写个shell脚本;没接触过shell脚本,网上大部分例子都写的挺复杂的;贴个简单的,不带传参什么的;只是最简单的数据表的导出备份

    shell脚本生成.txt数据文件

    shell脚本生成.txt数据文件,shell脚本生成.txt数据文件

Global site tag (gtag.js) - Google Analytics