xml地图|网站地图|网站标签 [设为首页] [加入收藏]

软件专题

当前位置:美高梅游戏网站 > 软件专题 > Shell脚本,简单& 强大,shell脚本

Shell脚本,简单& 强大,shell脚本

来源:http://www.gd-chuangmei.com 作者:美高梅游戏网站 时间:2019-09-02 13:43

Shell脚本,简单& 强大,shell脚本

  摘自《码农增刊Linus与Linux》,章节:你可能不知道的Shell。     最近阅读完这本书,觉得其中有很多不错的内容,这是其中的一个Shell小甜点,拿来和大家一起分享一下,增加了一些我自己的测试内容。笔者写这个随笔,旨在分享和提高大家对Shell的兴趣。      阅读以下部分前,强烈建议读者打开一个shell 实验,这些都不是shell 教科书里的大路货哦:)      1. sudo !! 以root 的身份执行上一条命令。场景举例:比如Ubuntu 里用apt- get 安装软件包的时候是需要root 身份的,我们经常会忘记在apt- get 前加sudo。每次不得不加上sudo 再重新键入这行命令,这时可以很方便的用sudo !!完事。      2. cd – 回到上一次的目录。场景举例:当前目录为/ home/ a,用cd ../b 切换到/ home/ b。这时可以通过反复执行cd –命令在/ home/ a 和/ home/ b 之间来回方便的切换。      3. ^ old^ new 替换前一条命令里的部分字符串。场景:echo "wanderful",其实是想输出echo "wonderful"。只需要^ a^ o 就行了,对很长的命令的错误拼写有很大的帮助。      4. man ascii 显示ascii 码表。场景:忘记ascii 码表的时候还需要google 么? 尤其在天朝网络如此“ 顺畅” 的情况下,就更麻烦在GWF 多应用一次规则了,直接用本地的man ascii 吧。      这个功能很有用,经常会遇到编码记忆模糊,随手一查就可以了。   图片 1      5. ctrl- x e 快速启动你的默认编辑器(由变量$ EDITOR 设置)。      6. netstat –tlnp 列出本机进程监听的端口号。      7. tail -f /path/ to/file. log | sed '/^Finished: SUCCESS$/ q' 当file. log 里出现Finished: SUCCESS 时候就退出tail,这个命令用于实时监控并过滤log 是否出现了某条记录。      8. ssh [email protected] bash < /path/ to/ local/script. sh 在远程机器上运行一段脚本。这条命令最大的好处就是不用把脚本拷到远程机器上。      9. screen -d -m -S some_ name ping my_ router 后台运行一段不终止的程序,并可以随时查看它的状态。- d -m 参数启动“ 分离” 模式,- S 指定了一个session 的标识。可以通过- R 命令来重新“ 挂载” 一个标识的session。更多细节请参考screen 用法man screen。      10. wget --random- wait -r -p -e robots= off -U mozilla http:// www. example. com 下载整个www. example. com 网站。11. curl ifconfig. me 当你的机器在内网的时候,可以通过这个命令查看外网的IP。      12. lsof –i 实时查看本机网络服务的活动状态。      13. python -m SimpleHTTPServer 一句话实现一个HTTP server,把当前目录设为HTTP 服务目录,可以通过http:// localhost: 8000 访问这也许是这个星球上最简单的HTTP 服务器的实现了。 图片 2 1 [[email protected] httpTest]$ python -m SimpleHTTPServer 2 Serving HTTP on 0.0.0.0 port 8000 ... 3 192.168.153.128 - - [27/Dec/2014 19:10:46] "GET / HTTP/1.1" 200 - 4 192.168.153.128 - - [27/Dec/2014 19:10:46] code 404, message File not found 5 192.168.153.128 - - [27/Dec/2014 19:10:46] "GET /favicon.ico HTTP/1.1" 404 - 6 192.168.153.128 - - [27/Dec/2014 19:10:46] code 404, message File not found 7 192.168.153.128 - - [27/Dec/2014 19:10:46] "GET /favicon.ico HTTP/1.1" 404 - 8 192.168.153.128 - - [27/Dec/2014 19:12:22] "GET / HTTP/1.1" 200 - 9 192.168.153.128 - - [27/Dec/2014 19:13:03] "GET / HTTP/1.1" 200 - 10 [[email protected] httpTest]$ netstat -lnpt 11 (Not all processes could be identified, non-owned process info 12 will not be shown, you would have to be root to see it all.) 13 Active Internet connections (only servers) 14 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 15 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - 16 tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN - 17 tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN - 18 tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 2574/python 19 tcp 0 0 :::22 :::* LISTEN - 20 tcp 0 0 ::1:631 :::* LISTEN - 21 tcp 0 0 ::1:25 :::* LISTEN - View Code   在目录下写了一个index.html显示的结果如下,it's fun. 图片 31 <html> 2 <head> 3 <title>test python web server</title> 4 </head> 5 <body> 6 This is a test python web server, <b>hello!</b> 7 </body> 8 </html> View Code   图片 4      14. history | awk '{CMD[$ 2]++; count++;} END { for (a in CMD )print CMD[ a] " " CMD[ a]/ count* 100 "% " a }' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10 这行脚本能输出你最常用的十条命令,由此甚至可以洞察你是一个什么类型的程序员。看不懂行代码?没关系,系统的学习一下* nix shell 脚本吧,力荐《Linux 命令行与Shell 脚本编程大全》。最后还是那句Shell 的至理名言:“Where there is a shell,there is a way!”   图片 5   这个命令行很有意思,激励大家去学习一下awk、sed、sort方便快捷的实现日常的工作。

强大,shell脚本 摘自《码农增刊Linus与Linux》,章节:你可能不知道的Shell。 最近阅读完这本书,觉得其中有很多不错的内容...

sed && awk工具 及一些常用的shell脚本

(一)sed

sed是一个精简的、非交互式的流式编辑器,它在命令行中输入编辑命令和指定文件名,然后在屏幕上查看输出。

逐行读取文件内容存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。原文件爱你的内容并没有改变。

 

sed '4,$d' test.in # 删除4~最后一行
sed '3q' test.in # 读到指定行之后退出
sed 's/public/PUBLIC/' test.in # 替换public为PUBLIC
sed -n 's/public/PUBLIC/p' test.in #打印匹配行

sed [options] sed_cmd files

 

-e 连接多个编辑命令
-f 指定sed脚本文件名
-n 阻止输入行自动输出

通常grep也能达到效果,例如统计指定文件中的行数
COUNT=$(cat $FILE | grep -a "关键字" | wc -l)

指定多个命令的三种方法:
1.用分号分隔命令

sed 's/public/PUBLIC/;s/north/NORTH/' test.in

2.每个命令前放置-e

sed -e 's/public/PUBLIC' -e 's/north/NORTH' test.in

3.使用分行命令功能,在输入单引号后按Enter键就会出现多行提示符(>)

sed '
> s/public/PUBLIC/
> s/northNORTH' test.in

 

常用的定位命令:

图片 6

常见的编辑命令:

p: 打印匹配行
sed -n '3,5p' test,in
=: 显示匹配行的行号
sed -n '/north/=' test.in
d: 删除匹配的行
sed -n '/north/d' test.in
a: 在指定行之后追加一行或者多行文本,并显示添加的新内容。
sed '/north/aAAA
>BBB
>CCC' test.in
i: 在指定行之前插入一行或者多行文本,并显示新内容,同上。
c: 用新文本替换指定的行,使用格式同上
l : 显示指定行中的所有字符,包括控制字符(非打印字符)
sed -n '/north/l' test.in
s:替换命令,使用格式为
[address] s/old/new/[gpw]
address:如果省略,表示编辑所有的行
g: 全局替换
p: 打印被修改后的行
w fname: 将被替换后的内容写到指定的文件中
sed -n 's/north/NORTH/gp' test.in
sed -n 's/north/NORTH/w data' test.in
sed 's/[0-9][0-9]$/&.5/' datafile
&符号用在替换字符串中时,代表被替换的字符串
r: 读文件,将另外一个文件中的内容附加到指定行后
sed '$r data' test.in
w: 写文件,将指定行写入到另外一个文件中
sed -n '/public/w date2' test.in
n: 将指定行的下面一行读入编辑缓冲区
sed -n '/public/{n;s/north/NORTH/p}' test.in
对指定行同时使用多个sed编辑命令时,需用大括号括起来,命令之间用分号;隔开。
q:退出,读取到指定行之后退出sed
sed '3q' test.in

图片 7

(二)awk

awk可以对列进行处理
简单用法:
awk [options] sed_script files
-F 指定输入记录字段的分隔符,默认环境变量IFS的值
-f 从指定文件读取awk_script
-v 为awk设定变量

awk -F:'{print $1}' /etc/passwd
awk -F:'/root{print $1 "|" $3}' /etc/passwd

图片 8

 

awk的执行过程:

  1. 如果存在BEGIN,awk首先执行他指定的actions
  2. awk从输入中读取一行,称为一条消息记录
    3. awk将读入的记录分割成数个字段,并将第一个字段放入变量$1中,第二个放入变量$2中,依次类推;$0表示整条记录;字段分隔符可以通过选项-F指定,否则使用缺省的分隔符。
  3. 把当前输入记录依次与每一个awk_cmd中的pattern比较:
    如果相匹配,就执行对应的actions
    如果不匹配,就跳过对应的actions,直到完成所有的awk_cmd
    5. 当一条输入记录记录完毕后,awk读取输入的下一行,重复上面的处理过程,直到所有输入全部处理完毕。
  4. awk处理完所有的输入后,若存在END,执行相应的actions
  5. 如果输入是文件列表,awk将按顺序处理列表中的每个文件

awk处理的例子:

ifconfig | awk '/inet addr/{ print $2 }'| awk -F:'{ print $2 }'
ifconfig | awk '/inet addr/{ print $2 }'|awk -F: 'BEGIN { print "begin..."}'{ print $2 } END { print "end..." }'

另外,awk还可以处理复合表达式:

 

图片 9

最后,awk不仅是一个命令,它更是一个编程语言
变量:

  1. 内部变量 awk '{print NR,$0}' #给文件加上行号
    2.自定义变量
    函数:
    1.内置函数
    2.自定义函数
    awk '{print sum($1,$2)} function sum(x,y){s=x+y;return s}' grade.txt
    数组
    awk 'BEGIN {print split("123#456",arr,"#");for(i in arr){print arr[i]}}'

由于这些比较复杂,本文不再展开介绍。

最后附上几个简单的shell脚本,更多的实例在我的Github上。

(1)比较大小

#!/bin/bash

echo "please input the two numbers:"
read a
read b
if (($a==$b));then
    echo "a = b"
elif (($a>$b));then
    echo "a > b"
else
    echo "a < b"
fi

(2)查找文件

#!/bin/bash

echo "Enter a file name :"
read a
if [ -e /home/tach/$a ];then
    echo "the file is exist!"
else
    echo "the file is not exist!"
fi

(3)删除大小为0的文件

#!/bin/bash

for filename in `ls`
do 
        a=$(ls -l $filename | awk '{print $5}')
        if ((a==0));then
            rm $filename
        fi
done

(4)查看本机IP地址

#!/bin/bash

ifconfig | grep "inet 地址:" | awk '{print $2}' | sed 's/地址:'//g

(5)IP地址合法性判断

#!/bin/bash

CheckIPAddr()
{
   #IP地址需由三个.分隔且均是数字
   echo $1 | grep "^[0-9]{1,3}.([0-9]{1,3}.){2}[0-9]{1,3}$" > /dev/null
   if [ $? -ne 0 ];then
       return 1
   fi
   ipaddr=$1
   a=`echo $ipaddr | awk -F. '{print $1}'`
   b=`echo $ipaddr | awk -F. '{print $2}'`
   c=`echo $ipaddr | awk -F. '{print $3}'`
   d=`echo $ipaddr | awk -F. '{print $4}'`
   for num in $a $b $c $d
   do
       if [ $num -gt 255 -o $num -lt 0 ];then
           return 1
       fi
   done
   return 0
}

if [ $# -ne 1 ];then
    echo "Usage :$0 ipaddr."
    exit
else
    CheckIPAddr $1
    ans=$?
    if [ $ans -eq 0 ];then
        echo "legal ip address."
    else
        echo "unlegal ip address."
    fi

fi

(6)其他

#!/bin/bash

#显示当前日期和时间
echo `date +%Y-%m-%d-%H:%M:%S`

#查看哪个IP地址连接的最多
netstat -an | grep ESTABLISHED | awk '{print $5}'|awk -F: '{print $1}' | sort | uniq -c

#awk不排序删除重复行
awk '!x[$0]++' filename 
#x只是一个数据参数的名字,是一个map,做指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;不成立,直接跳过这一行

#查看最常使用的10个unix命令
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -rn | head -n 10
#sort中的-r是降序,_-n是按照数值排序(默认比较字符,10<2)

#逆序查看文件
cat 1.txt | awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }'

#查看第3到6行
awk 'NR >=3 && NR <=6' filename 

#crontab文件的一些示例
30 21 * * * /usr/local/etc/rc.d/lighttpd restart #每晚9.30重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart #每月的1,10,22日的4:45重启apache
10 1 * * 6,0  /usr/local/etc/rc.d/lighttpd restart  #每周六、日的1:10重启apache
0,30 18-23 * * *  /usr/local/etc/rc.d/lighttpd restart #表示在每天18.00至23.00之间每隔30分钟重启apache
* 23-7/1 * * *  /usr/local/etc/rc.d/lighttpd restart #晚上11点到早上7点之间,每隔一小时重启apache

awk工具 及一些常用的shell脚本 (一)sed sed是一个精简的、非交互式的流式编辑器,它在命令行中输入编辑命令和指定文件名,然后在屏...

本文由美高梅游戏网站发布于软件专题,转载请注明出处:Shell脚本,简单&amp;amp; 强大,shell脚本

关键词: