netstat -tnlp|egrep -i "$1"|awk {'print $7'}|awk -F'/' '{print $NF}'
扫描当前机器运行的服务名称
netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'
扫描当前机器运行的服务端口
shell中的特殊变量
$0 执行脚本的名字
$1~$n 第1个参数,,第n个参数
$# 参数的个数
$*和$@ 将所有参数返回
$_ 上一个命令的最后一个参数
$$ 所在命令的pid
$! 最后执行的后台命令的pid
$? 上一个命令执行是否成功,成功为0,不成功非0
条件测试操作与流程控制语句
【IF条件语句】
▼格式1
if 条件判断命令
then 满足判断,执行命令1
else 不满足判断,执行命令2
fi
▼格式2
if 条件判断命令1,then
满足判断1执行命令1
elif 条件判断命令2,then
满足判断2执行命令2
elif ...
else
以上判断都不符合,执行命令n
fi
【for循环语句】 依次取,取完就结束。
▼格式
for 变量名 in 取值范围
do
执行命令
done
【while循环语句】 只要判断为真,就一直执行。直到判断为假才停止。
▼格式
while 判断命令
do
执行命令
done
【case多重分支语句】根据变量的不同取值,分别执行不同的命令。
▼格式
case 变量名 in
模式1)
执行命令1
;;
模式2)
执行命令2
;;
*)
默认执行的命令
;;
esac
【循环控制语句】
break 跳出当前循环,直接执行循环语句后的命令内容
continue 跳过这一次循环,直接开始新的判断,继续下一个循环。
sed
1 使用双引号""
2 s表示替换 /g表示一行上替换所有的匹配
3 -i 直接修改内容
sed -i "s/aa/bb/g' abc.tx" 把abc文件中aa替换成bb,并保存修改
-n 选项
awk
▼ 示例,输出第一列和第四列。 其中单引号中被大括号括着的就是awk语句。 也只能被单引号''括着。
netstat -an |head -10 |awk '{print $1,$4}'
netstat -an |head -10 |awk '$3==0 && $6=="ESTABLISHED"'
▼ 内建变量
NR 表示记录数(即行号),在执行过程中对应于当前的行号。NR是从1开始不停叠加。如若多个文件,另一个文件不会从1重新开始。
NFR 表示当前读取的记录数。(行号,但是换文件后,从1重新开始)
NF 表示字段数(即列数),在执行过程中对应于当前的字段数。
RS 输入记录的换行符,默认换行符()
OFS 输出字段的分隔符,默认空格(输出的结果,每一截的分隔符)
ORS 输出记录分隔符,默认换行符(输出的结果,每一行的分隔符)
$0 当前记录(存放着整行内容)
$1~$n 当前记录的第n个字段
netstat -an |head -10 |awk '$3==0 && $6=="ESTABLISHED" ||NR==1 '
▼ 格式化输出
%+20s 右对齐
%-20s 左对齐
%02s 字符串不足2位时,在前面补0
%2s 字符串不足2位时,在前面补空格
%s 字符串
%f 浮点数
%d 十进制有符号整数
\n 换行
netstat -an |head -10 |awk '$3==0 && $6=="ESTABLISHED" ||NR==2 {printf "%+20s,%s,%s-20s",$4,$5,$6 }'
解释:{printf "第一个输出的打印格式,第二个,第三个",第一个参数,第二个,第三个}
▼ 指定分割符
-F分隔符号 等同于 FS="分割符号"
awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd //第一种写法
awk -F: '{print $1,$3,$6}' /etc/passwd //等价于第一种写法
awk -F '[;:]' //指定多个分隔符[]
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd //输入以:分割 输出的结果每一截以\t分割(即tab键)
▼ 字符串匹配
awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt //匹配带有FIN字样状态,~表示模式开始 两个斜线//之间是模式。就是一个正则表达式匹配。
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt //匹配wait字样状态
awk '/LISTEN/' netstat.txt //可以像grep一样匹配关键词,显示行结果
awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt //fin或者time,两者选一个
awk '$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt //模式取反,相当于grep -v 第一种写法 !~ /关键词/
awk '!/WAIT/' netstat.txt //模式取反,第二种写法。 第二种写法 !/关键词/
▼ 拆分文件
awk拆分文件使用重定向。
$ awk 'NR!=1{print > $6}' netstat.txt //按第六列拆分文件;NR!=1表示不处理表头。
$ ls
ESTABLISHED FIN_WAIT1 FIN_WAIT2 LAST_ACK LISTEN netstat.txt TIME_WAIT
awk 'NR!=1{print $4,$5 > $6}' netstat.txt //把第四第五列输出到文件
awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; //第六列是time或estb就输出到1.txt
else if($6 ~ /LISTEN/) print > "2.txt"; //第六列是listen输出到2.txt
else print > "3.txt" }' netstat.txt //以上都不是,输出到3.txt
▼ 统计
ls -l *.cpp *.c *.h |awk '{sum+=$5} END {print sum}' //计算所有的C文件,CPP文件和H文件的文件大小总和。
2511401
awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt //统计各个connection的状态用法
TIME_WAIT, 3
FIN_WAIT1, 1
ps aux | awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}' //统计每个用户的进程内存占用情况
//+=的解释: a+=b相当于a=a+b, 即把a+b的值再赋值给a
mysql, 99928KB
root, 63644KB
▼ AWK脚本
awk脚本是由 模式 和 操作 组成的。
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file
模式:以下任意一个:
/正则表达式/:使用通配符的扩展集。
关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
模式匹配表达式:用运算符~(匹配)和~!(不匹配)。
BEGIN语句块、pattern语句块、END语句块
BEGIN{这里面放 执行前的语句}
END{这里面放 处理完所有的行之后要执行的语句}
{这里面放 处理每一行时,要执行的语句}
操作:一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内
变量或数组赋值
输出命令
内置函数
控制流语句
▼ 环境变量
和环境变量交互:(使用-v参数和ENVIRON,使用ENVIRON的环境变量需要export)
$ x=5
$ y=10
$ export y
$ echo $x $y
5 10
awk -v val=$x '{print $1, $2, $3, $4+val, $5+ENVIRON["y"]}' OFS="\t" score.txt
▼ 几个花活
#从file文件中找出长度大于80的行
awk 'length>80' file
#按连接数查看客户端IP
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
#打印99乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
■ 正则表达式
▼ 匹配文本中的所有单词
( ?[a-zA-Z]+ ?)
解释:[a-zA-Z]+ 表示一个或多个字母(a~z和A~Z) ?用于匹配单词前后可能出现的空格
▼ 匹配一个IP地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
解释:[0-9]匹配数字0到9 {1,3}匹配1到3个数字 \.匹配“.”
▼ 正则表达式的组成部分:
^ 行起始标记 ^abc 以abc开头
$ 行尾标记 abc$ 以abc结尾
. 任意一个字符 test. 匹配如test1 test2等
[] 包含在[字符]内的任意一个字符 coo[kl] 匹配cook 或 cool
[^] 除[^字符]之外的任意一个字符 9[^01] 匹配只要不是90或91
[-] []中指定范围内的任意一个字符 [1-5] 匹配1-5之间任意一个数字
? 匹配?之前的项1次或0次 aab?cc 匹配aacc 或 aabbcc
+ 匹配?之前的项1次或多次 sa6+ 匹配sa6 或 sa666等等
* 匹配?之前的项0次或多次 co*l 匹配cl 或 col 或 cool 等等
() 创建一个用于匹配的字串 ma(tri)?x 匹配max 或 maxtrix
{n} 匹配之前的项N次 [0-9]{3} 匹配任意一个三位数,相当于[0-9][0-9][0-9]
{n,}匹配之前的项至少N次 [0-9]{2,} 匹配任意一个两位数,或更多位数
{n,m}匹配之前的项至少N次,最后M次 [0-9]{2,4} 匹配两位数到四位数之间的任意一个数字
| 交替匹配|两侧的任意一项 Oct (1st | 2nd) 匹配Oct 1st 或 Oct 2nd
\ 将上述特殊字符转义 a\.b 匹配a.b
▼ 元字符:
\b 不消耗字符,职匹配一个位置 如this is tom.匹配单独的单词is 写成 "\bis\b"
\d 匹配数字
\w 匹配字母、数字、下划线
\s 匹配空格
[abc] 匹配字符组
大写就是反义,匹配不是...什么什么(与上面小写相反)
\W \S \D [^abc]
▼ 量词:
* 贪婪 重复零次或更多
+ 懒惰 重复一次或更多
? 占有 重复零次或一次
{n} 重复n次
{n,m}重复n到m次
{n,}重复n次或更多次
▼ shell变量:
$1 传递给shell的第一个参数
$# 添加到shell的参数个数
$0 shell本身的文件名
$1~$n 添加到shell的各参数值
Shell脚本攻略第二版 总结:
■ 日期
date
■ xargs 54
■ 临时文件名与随机数 72
//创建临时文件并进行不同的命名。
filename='mktemp'
echo $filename
■ grep 122
■ cut 128
■ sed 131
■ awk 135
http://www.ituring.com.cn/article/265331
第1章
主要内容:bash基础概念、终端打印、数学运算等
主要命令:let,cat,变量字符串处理,数学计算,管道|,重定向,$,expr,bc,echo,$#,$*,$0,eval,tr,printf,read,tput,循环语句,条件语句,分隔符IFS等
章节总结:
▼ 文本行#!/bin/bash中的#!读作shebang(也可读作hashbang,pound-bang)
▼ 终端打印除了echo命令还可以用printf(语法规则同C语言类似)
例:printf "%s %f\n" swf 1234
#输出显示为 swf 1234.000000
▼ 变量替换在单引号中无效
▼ 打印彩色字体,
例:echo -e "\e[1;31m 红色字体文本 \e[0m"
#解释:\e[1;31m 表示将颜色设置为红色 ;前的数字表示背景颜色 ;后的表示字体颜色 \e[0m将颜色重置回白色
▼ 查询某程序运行时的环境变量
例:cat /proc/进程ID/environ
#解释(pgrep java查看java的pid,或者用ps aux|grep gedit查看)
▼ 将输出重新格式化用tr
例: cat /proc/7315/environ | tr '\0' '\n' #讲解: \0以null字符分隔 \n以换行符分隔
这段命令其实就是 把分隔符null替换成换行符,执行结果输出显示出来就是一行显示一组字符串。
▼ 获取字符串长度
例:var=freedom;echo ${#var}
#输出结果是 7 (因为freedom就是7个字符)
解释: #是number sign 获取当前shell用echo $0 或者 echo $SHELL (echo $UID 如果显示为0就是root用户)
▼ 使用函数添加环境变量 不懂,P10
${parameter:+expression} 如果parameter有值且不为空,则使用expression的值。prepend() { [ -d "$2" ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1; } (eval`可将多个参数整合成一个参数)
▼ 显示/修改Bash提示字符串
例: echo $PS1/PS1="freedom"
▼ shell数学运算 跳过回头补
#let 变量名前不需要用$,如let result=no1+no2; echo $result
#(()) 如result=$(( no1 + 50 )) 或 result=$ (( $no1 + 50 ))
#[] 如result=$[ no1 + no2]或result=$[ $no1 + 5 ]
#expr 如result=反引号expr 3 + 4反引号 或 result=$(expr $no1 + 5)
#bc命令(支持浮点数)echo "scale=2;3/8" | bc 设置小数位数为2; echo "obase=2;$no" | bc将数字转化为2进制; echo "obase=10;ibase=2;$no" | bc 将二进制转化为十进制
▼ 输出重定向 跳过
stderr转换成stdout重定向
例: cmd 2>&1 stdout.txt 或者 cmd &> output.txt
接收来自stdin的数据,将副本写入FILE1和FILE2,同时也将副本左后后续命令的stdin
例:command | tee FILE1 FILE2
将stdin作为命令参数
例:cmd -
▼ 脚本内部文件块重定向 代码
▼ 自定义文件描述符 代码
▼ 数组
打印一个元素 array_var=(s w f), echo ${array_var[0]}+
打印数组长度 echo ${#array_var[*]}
打印出数组索引列表 echo ${!array_var[*]}
打印出所有元素 echo ${array_var[*]}
▼ 关联数组(相当于字典)
先声明declare -A ass_array,再赋值ass_array=([index1]=val1 [index2]=val2) 或者 ass_array[index3]=val3 其他操作同上,只是索引不再是数字了
▼ 当用alias设置了别名命令后,当不想用这个别名是,可对其进行转义即 \command
▼ 获取当前终端行数/列数/终端名 tput lines/tput cols/tput longname; tput sc存储光标位置, tput rc恢复光标位置 tput ed清除从当前光标位置到行尾之间的所有内容 (下面实现一个计时器) 代码
▼ 通过stty实现 输入密码时不应显示输入内容(也可直接read -s启动slient模式,但stty更通用) 代码
▼ date +%s 打印timestamp (从1970年1月1日0点开始的秒数)即POSIX时间; date "+%d %B %Y" 按格式输出
▼ 调试脚本 代码
#bash -x script.sh 或 sh -x script.sh
#set -x和set +x(执行命令后会显示该指令及其参数);set -v当命令进行读取时显示输入,set +v进制打印输入 详细介绍
#将shebang从#!/bin/bash 改成 #!/bin/bash -xv 也可(./script.sh运行)
#自定义格式显示调试信息,新建如下脚本,然后命令行键入 [root@share codes]# _DEBUG=on sh debug.sh (:告诉shell不进行任何操作)
▼ 函数和参数
▼
▼
▼
▼
▼ 函数和参数
$@ 被扩展成 $1 $2 $3等
$* 被扩展成$1c$2c$3(c是IFS的第一个字符, IFS即internal field seprator, env | grep IFS或set | grep IFS查看)
$? 获取命令或函数的返回值
"$@" 比 "$*" 更常用,后者会把所有参数当作单个字符串处理
递归 F() { echo $1; F hello; sleep 1; },这是 fork bomb :(){ :|:& };: (可通过修改/etc/security/limits.conf或命令ulimit来限制生成的最大进程数)维基扩展
导出函数 export -f fname 可将函数的作用域扩展到子进程中
向命令传递参数的方式command -p -v -k 1 file或者command -pv -k1 file或者command -pvk 1 file或者command file -pvk 1
▼ 存储命令的输出此处有代码
$( ) 通过子shell方式, 如 output=$(ls | cat -n) 子shell里面的变化如cd XX等不会反应到主shell中
反引用方式(通过反引号)
可将子shell或反引用放入以个双引号中,以保留空格和换行符(\n)
▼ read -n 5 -s -t 2 -d ":" -p "Enter your password:" var 从输入中以无回显的方式读取5个字符并存入变量var中,且需要在2秒内输入,以:作为输入行的结束符,终端会有"Enter your password:"的提示
true作为/bin中的一个二进制文件来实现的,即表示每执行一次便会生成一个进程,若不想则可以通过内建的:命令(其总会返回0)此处有代码
▼ 字段分隔符 IFS 此处有代码
▼ 循环语句
for in do done, while do done, until do done 连写成一行时,do前要用;
▼ 比较语句
#if then fi, if then else if then else fi 连写成一行时,then前用;
#[ condition ] && action 或 [ condition ] || action
#算数比较 -eq, -ne, -lt, -ge, -le; [ $var1 -ne 0 -a $var2 -gt 2 ](AND条件用-a,OR条件用-o),也可分开用类似[ ] && [ ]
#文件系统相关测试 -f, -d, -e, -b, -w, -r, -x, -L (用[ ])
#字符串比较 [[ ]] (-z, -n , ==, !=)