脚本基本语句用法笔记
- grep
-i 查询时不区分大小写
-n打印匹配的行号
-v 打印不匹配的行
-AX包括每次匹配之后X行
-BX包括每次匹配之后X行
cat /etc/passwd |grep student (-i 表示不关心大小写)
正则表达式中 ^代表开始 $代表结束
cat /etc/passwd|grep ^# -v (去掉以#作为起始的行)
cat /etc/passwd|grep ^$ -v (去掉空行)
-E增强符号的使用
cat inittab |grep -Ev ‘(^#|^$)’ 等价于 cat inittab |grep -Ev ‘^(#|$)’
文件处理后重新保存错误示范:
cat inittab |grep -Ev ‘^(#|$)’ >inittab 这样会得到一个空文件。
解决办法:
cat inittab |grep -Ev ‘^(#|$)’ >inittab.tmp ;cat ./inittab.tmp > inittab;rm -f ./inittab.tmp
- sed
sed ‘s/ search / replace / ’ 或者 ‘s# # # ’ 或者 ‘s@ @ @’
echo “/usr/local” |sed ‘s@/usr@/var@’
cat ./iptables.list | sed ‘s/172.24./10.0./’ 重新cat ./iptables.list后发现内容并没有发生改变再次印证了sed只是改变的流
sed 的搜索默认是在一行里找到第一个符合条件的信息就停止搜索行内剩余的信息。过想继续搜索行内的其他符合条件的信息需要添加g形成
‘
s/ / /g’ 的形式 ‘s/ / /i’可以忽略大小写
cat ./iptables.list | sed ‘1,50s/172.24./10.0./’ 1到50行中的进行替换
cat animal.txt |sed ‘/cat/,/dog/s/$/<---------/’传说中的猫鼠游戏可以实现模糊行的匹配
遇到cat开始dog结束 在这些符合的行中在结尾添加<—————
如果没有遇到dog那就一直执行一直到最后
sed的删除操作 cat iptables.list |sed ‘/^#/d’ 形式就是如此
要实现将#开始的 或者空行都删掉
cat iptables.list |sed ‘/^#/d’ |sed ‘/^$/d’
cat iptables.list |sed -e ‘/^#/d’ -e ‘/^$/d’
- wc对行数的统计
cat /etc/passwd |wc
37 63 1737
出现有37行 63个word 1737个字符(character)
cat /etc/passwd |wc -w
63
cat /etc/passwd |wc -l
37
cat /etc/passwd |wc -c
1737
cat /etc/passwd |grep -i studenttt |wc -l 用该命令的输出数值来判断是否存在,cat命令在不存在符合要求的时候,是不会输出信息的,故而不能做判断用。
- awk
awk’ /匹配字符串/’文件名 匹配字符串可以用正则表达式来表示
awk ‘/root/’ /etc/passwd 等价于 grep root /etc/passwd
awk ‘{处理动作}’文件名
awk -F:’{print 113}’ /etc/passwd
awk ‘/匹配字符串/ {处理动作}’文件名
awk -F:’/root/{print 1,1,3}’ /etc/passwd
awk ‘{print 1,1,3}’ ~/names 可以找出第一列和第三列的内容
awk ‘{print 1,1,3}’ ~/names 该表达式中逗号表示一个空格的分隔符
如果该表达式中逗号用空格代替,效果等价于awk ‘{printf 11<script id="MathJax-Element-5" type="math/tex">1</script>3}’
~/names 仅仅把第1,3列拼接在一起。
print函数将变量和字符夹杂着输出,如同linux中的echo命令
shell>date
Wed Feb 24 10:22:28 CST 2010
shell> date|gawk’{print “Month:”$2”\nYear:”,$6}’
Month:Feb
Year:2010
最近在读一个脚本,先把里面这些晦涩的脚本用法摘出来,磨刀不误砍柴工。