1,正则表达式的特殊符号:
[:alnum:]代表英文大小写字母及数字
[:alpha:]代表英文大小写字母
[:blank:]代表空格和 tab 键
[:cntrl:]键盘上的控制按键,如 CR,LF,TAB,DEL
[:digit:]代表数字
[:graph:]代表空白字符以外的其他
[:lower:]小写字母
[:print:]可以被打印出来的任何字符
[:punct:]代表标点符号
[:upper:]代表大写字符
[:space:]任何会产生空白的字符如空格,tab,CR 等
[:xdigit:]代表 16 进位的数字类型
2参数说明
-a :将 binary 档案以 text 档案的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
3.字符组匹配:
[]中包含的任意一个字符 只能是一个 [^...]排除型字符组
[abc] :表示“a”或“b”或“c”
[0-9] :表示 0~9 中任意一个数字,等价于[0123456789]
[\u4e00-\u9fa5] :表示任意一个汉字
[^a1<] :表示除“a”、“1”、“<”外的其它任意一个字符
[^a-z] :表示除小写字母外的任意一个字符
eg:
查找“tast”或者“test”两个字符串。
# grep -n 't[ae]st' regular_express.txt
查找不包含“#”的字符串
# grep -n '[^#]' regular_express.txt
查找字符“oog”,如果我不想要“oog”字符前面有 g,则查找“[^g]oog”,同理,查找“[^go]oog”是指字符“oog”前面不能为 g 或者 o。
4.行首符^ 行尾符 $
例如 ①查找一个文件中行首为"the"的字符行
②查找行首为大写字母的行
③查找d结尾的行
④查找空行 grep -n '^$' wqq.txt
⑤查看文件 过滤空白行 注释行
⑥* 代表重复前面0个或者多个字符
e* 表示具有空字符或者一个以上e字符
ee* 表示前面的第一个e字符必须存在 ,第二个e则可以是0个或者多个e字符
ee*e 表示第一个和第三个e必须存在 第二个e则可以是0个或者多个e字符
5,限定连续字符范围{} {}大括号在shell中有特殊定义 需要转义
例子 查询连续两个o的字符行: gerp -n 'o\{2\}' wqq.txt
查找g后面2到5个o,再接g的字符串: grep -n 'go\{2,5\}g' wqq.txt
^word 表示带搜寻的字符串(word)在行首
word$ 表示带搜寻的字符串(word)在行尾
.(小数点) 表示 1 个任意字符
\ 表示转义字符,在特殊字符前加\会将特殊字符意义去除
* 表示重复 0 到无穷多个前一个 RE(正则表达式)字符
[list] 表示搜索含有 l,i,s,t 任意字符的字符串
[n1-n2] 表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等
[^list] 表示反向字符串的范围,例如[^0-9]表示非数字字符,[^A-Z]表示非大写字符范围
\{n,m\} 表示找出 n 到 m 个前一个 RE 字符
\{n,\} 表示 n 个以上的前一个 RE 字符
6,
sed 是非交互式的编辑器。它不会修改文件,除非使用 shell 重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed 编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先 sed 把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed 每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed 便结束运行。sed 把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
如果要修改原文件,可使用-i 选项。
例子:将wqq.txt文件列出并打印行号 同时将6-8行删除
!!! sed 是sed -e的简写 后接单引号
①删除第二行到最后一行 nl wqq.txt | sed '2,$d'
在原文件中删除第一行 sed -i '1d' wqq.txt
②a表示在行后加字符串 i表示在行前添加字符串
③ c为替换内容选项 将4-5行内容替换成 REPKAFKFFJ
④列出文件内第5-7行
⑤替换字符串
sed 's/被替换字符串/新字符串/g'
7.shell 脚本中$.代表
$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用
设置参数
#!/bin/sh
if [ $# -eq 3 ]; then //参数个数是3
sed -i 's#<'"$1"'\>.*<#<'"$1"'\>'"$2"'<#g' $3
else
echo replace error.
fi
root@CELL:~# cat /etc/config/ntpclient
config ntpserver
option hostname '1.cn.pool.ntp.org'
option port '123'
config ntpserver
option hostname '2.cn.pool.ntp.org'
option port '123'
config ntpserver
option hostname '3.cn.pool.ntp.org'
option port '123'
config ntpserver
option hostname '0.cn.pool.ntp.org'
option port '123'
config ntpdrift
option freq '0'
config ntpclient
option interval 21600
#option count 10
#option interface wan
cat /etc/config/ntpclient | grep hostname | awk -F[\'] '{print $2}' | sed -n "1p"
//先抽取hostname的所有行,awk遇到' 就分隔 ,按照'分隔的从最小位1开始,打印第二个就是1.cn.pool.ntp.org , 该文件中得到的是四行单引号中的值,然后抽取取到的第一行就是第一个hostname的值
cat /etc/config/ntpclient | grep interval | awk '{print $3}' //21600
root@CELL:~# cat /etc/config/ntpclient | awk '{print $3}' | sed -n 2p
'1.cn.pool.ntp.org'
root@CELL:~# cat /etc/config/ntpclient | awk '{print $3}' | sed -n 1p
root@CELL:~# cat /etc/config/ntpclient | awk '{print $3}' | sed -n 6p
'2.cn.pool.ntp.org'
root@CELL:~# cat /etc/config/ntpclient | awk '{print $3}' | sed -n 21p
21600
root@CELL:~#
root@CELL:~# cat /etc/config/ntpclient | awk '{print $3}' | sed -n 6p | sed -r "s/.*'(.+)'.*/\1/"
2.cn.pool.ntp.org
root@CELL:~# cat /etc/config/ntpclient | awk '{print $3}' | sed -n 21p | sed -r "s/.*'(.+)'.*/\1/"
21600
root@CELL:~#
awk 'NR==2{$4="06"}{print}' myfile >newfile
设置值 setNTPParameter.sh 红色的$1 $2 $3是传递的变量 灰色$3表示第三列
#!/bin/sh
if [ $# -eq 3 ]; then
awk 'NR=="'$1'"{$3="'$2'"}{print}' $3 > copy_ntpclient
mv copy_ntpclient $3
else
echo replace error
fi
/
如果写入当前文件 在xshell执行没有问题,放到站上就循环往文件结尾追加空值
#!/bin/sh
if [ $# -eq 3 ]; then
awk 'NR=="'$1'"{$3="'$2'"}{print > "'$3'"}' $3
else
echo replace error
fi