Shell编程

常用功能 2016/08/12

shell编程在处理一些问题的时候还是很方便的

1.正则表达式说明

常见的符号说明

单字符

. 任意字符 [] 字符范围

边界字符

^ 头字符     ^m  表示以字符m开始的行
$ 尾字符     grep '^$' test.txt   表示空行

元字符

\w  匹配任何字类字符,包括下划线[A-Za-z0-9_]
\W  匹配任何非字类字符
\b  代表单词的分隔

重复字符

?      0次或者1次 {0,1}
+		   至少一次重复 {1,}
*		   0次或多次 {0,}   {n,m}  重复特定次数 

1.匹配4-10位qq号

grep '^[0-9]\{4,10\}$' test.txt

2.匹配15或者18位的身份证号 不要忽略转义字符

grep '^[1-9]\([0-9]\{13\} \| [0-9]\{16\} \) [0-9xX]$' test.txt   

2.SED命令

sed [options] ‘command’ file(s) command : 行定位(正则) + sed 命令

options : [-nefri] 
-n: 只有经过sed处理后的行才会显示
-e: 一行有多条命令需要执行
-i: 直接修改文档原始内容
-f: 执行sed语句编写的文件

sed命令

a:新增(当前行下面)
i:插入(当前行前面)
c:取代
d:删除
p:打印
s:取代 sed 's/要被取代/新串/g'   g表示全行替换  还会忽略大小写

打印`一行` sed -n '10p' passwd sed -n '/root/p'  passwd	
打印`多行` sed -n '10,20p' passwd
定位`间隔几行` sed -n '1~2p' passwd  从第一行开始,间隔2行打印
指定行新增一行  sed -i '8 anihao' file.txt 

高级sed命令

q: 提前退出sed                      
	nl passwd | sed '/false/q'  --> 找到第一个fasle退出sed
():替换某种部分字符串 (\1,\2)       
	ifconfig eth0 | sed -n '/inet /p' | sed 's/ine.*r:\([0-9.]\+\) .*$/\1/      其中\1表示前面第一个括号匹配的数据 得到ip地址
&: 替换前面要替换的整体						
	echo Jack | sed 's/Jack/hello &/'    --> Hello Jack  其中:&  表示要被取代的串 Jack
r:复制指定文件插入到匹配行
w:复制匹配行拷贝制定文件里

实例:

nl passwd | sed '{20,30d;s/false/true/g}'  --> {}多个sed命令。用;分开
nl passwd | sed -n  '{p,n}' -->间隔行打印奇数行 {p打印,n读取下一行}
将文件下的.txt文件名转换为`大写`
ls *.txt | sed  's/^\w\+/\U&/'   --> 元字符\u\l\U\L 转换为大写小写字符 `u首字符大写 U全部大小`

3.AWK命令

awk [-F 分隔符] ‘commands’ input_file(s)

常用内置变量:
$0: 所有域    
$1 第一域
NR: 已读的记录数
NF: 每行经过分隔符后的字段总数
FILENAME : 正在处理的文件名

awk 逻辑判断式

~ 匹配 !~ 不匹配 > < == != 判断逻辑表达式

awk -f ':' '$1~/^m.*/{print $1 }' passwd  --> 匹配首字符是m的第一域
cat /etc/passwd | awk -F ':' 'BEGIN{print "name,shell"}{print $1 "," $7}END{print "---------"}'
awk -F ';' 'BEGIN {count=0;}{name[count++]=$1;}END{for(i=0;i<NR;i++) print i,name[i]}  /etc/passwd 

4.组合 实例说明

1.分割字符串 指定位数格式化

echo "123 456" | sed s/\ //g | awk '{print substr($1,1,3) ,substr($1,4,2)}'

5.脚本其他常用的功能

grep

-i 忽略大小写
^  匹配行开始
$  匹配行结尾
-v 取反匹配
-n 显示行号
-c 匹配的次数

cut

-c 1,3-5 切割第一个字符,第3-5个字符组合
-d 制定分隔符 跟-f一起用
-f 截取指定域 cut -f2 tab.txt 

sort

-u 去掉重复行
-R 随机排序
-n 按照数值大小排序 升序
-k 按照指定的列号排序
-t 指定分隔符
-o 指定存放的文件名

others

iconv -f GBK -t UTF-8  source_file > dest_file

dos2unix file_name

sed -i 's/$/ tjzx_jifen/g' file_name  //每行末尾加上 ( tjzx_jifen)包括空格

curl -T file_name  ftp://USER:PASSWD@192.168.0.40/  //上传文件到ftp服务器

awk '{ print $1",""001100059699773,tjzx_jifen"","$3","$4,$5}' file_name   > ${tmp_Log}  //awk 默认空格分隔,这样可以用逗号分隔

取字符串的长度 ${#string}

$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

6.参考资料

  1. linux命令大全

  2. linux之awk用法

  3. linux下awk内置函数的使用split/substr/length



扫描关注我

(转载本站文章请注明作者和出处 Undefined

Post Directory