Shell相关 基础 sed awk 。。。

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 , ==, !=)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,188评论 2 25
  • sed与awk实例 文本间隔 在每一行后面增加一空行 将原来的所有空行删除并在每一行后面增加一空行。这样在输出的文...
    stuha阅读 1,883评论 0 21
  • awk:报告生成器,格式化文本输出 内容: awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 a...
    BossHuang阅读 1,452评论 0 9
  • 本章主要学习内容awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 awk条件判断 a...
    楠人帮阅读 1,254评论 0 8
  • awk: grep,sed,awk grep:文本过滤 sed:文本编辑 awk:文本格式化工具; 1 什么是aw...
    木林森阅读 1,764评论 0 16