码迷,mamicode.com
首页 > 系统相关 > 详细

Shell 学习笔记

时间:2015-09-18 18:16:03      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

 

 

Linux & Shell

September 15, 2015 10:27 AM

文件

创建文件
touch filename

文件权限
9个权限位: 属主权限(u) 同组权限(g) 其他用户权限(o)
rwxrw-rw-

更改权限
chmod命令 赋权+ 收回-
chmod a+w filename 赋予所有用户写权限
chmod g-x o-x filename 收回同组和其他用户的执行权限

绝对模式(8进制数)
无任何权限(0) 读(4) 读+执行(5) 读+写(6) 读+写+执行(7)
chmod 666 所有用户读写权限
chmod 700 赋予文件属主读,写和执行的权限

目录权限
权限 drwx rwx r-x (775)
文件属主 读,写,执行
同组用户 读,写,执行
其他用户 读,执行

改变所有权
chown命令的一般形式为:
chmod -R -h owner file
-R 选项意味着对所有子目录下的文件也都进行同样的操作。
-h 选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。

chown username filename
chgrp groupname filename

找出你所属于的用户组
group或者id
例:group matty
$ sybadmin appsgen post
上面的命令告诉我们用户matty属于sybadmin、appsgen和post用户组。

符号链接
使用软链接来保存文件的多个映像
ln [-s] source_path target_path
例子:
ln -s /usr/opt/monitor/regstar/reg.log /var/adm/logs/monitor.log

链接-应用场景
假如系统中有40个销售和管理用户,销售用户使用一个销售应用程序,而管理用户使用一个管理应用程序。我作为系统管理员该怎么做呢?
首先删除它们各自$HOME目录下的所有.profile文件。
然后在/usr/local/menus/目录下创建两个profile文件,一个是sales.profile,一个是admin.profile,它们分别为销售和管理人员提供了所需的环境,并引导他们进入相应的应用程序。
现在我在所有销售人员的$HOME目录下分别创建一个指向sales.profile的链接,在所有管理人员的$HOME目录下分别创建一个指向admin.profile文件的链接。

输出重定向
< 的作用是调取后面的文件然后用<前进行操作。
> 的作用就是把前面的内容输出到后面的文件中,如果目的地不存在,那么创建,已存在那么替换掉原数据。
>>是添加文件到末尾,这个对配置文件很有效。

正则表达式

[0-9]
[a-zA-Z]
^A 行首为A
[^A] 匹配A之外的所有字符
[a-z] 匹配a-z
^[^A] 除去行首为A的
$ 行末
\ 转义元字符
. 任意一个字符
* 匹配零个或零个以上重复的字符
\{\} 匹配模式结果出现的次数

pattern\{n\} 匹配模式出现n次。
pattern\{n,\} 匹配模式出现最少n次。
pattern\{n,m} 匹配模式出现n到m次之间,n , m 为0 - 255中任意整数。

给出出现次数范围,例如A出现2次到4次之间:
A{2,4}B
则结果为AAB、AAAB、AAAAB

sort

用法:将输入行按键值字段与数据类型选项以及locale排序。
语法:sort [options..] [file(s)]
主要选项:
-b:忽略开头的空白。
-d:字典顺序
-r:倒序
-o:输出到指定文件
-n:以整数类型作比较

grep

常用的grep选项有
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。

在调用变量时,也应该使用双引号
在所有.doc文件中查询”sort”字符串:
grep “sort” *.doc

awk

有三种方式调用awk

  • 第一种是命令行方式
    awk [-F field-separator] ‘commands‘ inputfile(s)
    这里,commands是真正的awk命令
    [-F域分隔符]是可选的,因为awk使用空格作为缺省的域分隔符
    例:冒号作为分隔符
    awk -F: ‘commands‘ inputfile

  • 第二种方法是将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释
    器作为脚本的首行,以便通过键入脚本名称来调用它。

  • 第三种方式是将所有的awk命令插入一个单独文件,然后调用:
    `awk -f awk_script_file inputfile(s)

  • f选项指明在文件awk_script_file中的awk脚本, inputfile(s)是使用awk进行浏览的文件
    名。

保存awk输出

  • 最简单的方式是使用输出重定向符号>文件名,
    例:重定向输出到文件wow
    awk ‘{print $0}‘ grade.txt > wow
  • 第二种方法是使用tee命令,在输出到文件的同时输出到屏幕。
    awk ‘{print $0}‘ grade.txt | tee delete_me_and_die

awk错误处理
在碰到awk错误时,可相应查找:

  • 确保整个awk命令用单引号括起来。
  • 确保命令内所有引号成对出现。
  • 确保用花括号括起动作语句,用圆括号括起条件语句。
  • 可能忘记使用花括号,也许你认为没有必要,但awk不这样认为,将按之解释语法。

sed

sed是一个非交互性性文本编辑器, 它编辑文件或标准输入导出的文件拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道文件。sed可以随意编辑小或大的文件,有许多sed命令用来编辑、删除,并允许做这项工作时不在现场。sed一次性处理所有改变,因而变得很有效,对用户来说,最重要的是节省了时间。sed必须通过行号和正则表达式指定要改变的文本行

sed怎样读取数据
sed从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它,重复过程直到命令结束

sed命令的调用
在命令行键入命令;将sed命令插入脚本文件,然后调用sed;将sed命令插入脚本文件,并使sed脚本可执行
sed [option] sed命令 输入文件 在命令行使用sed命令,实际命令要加单引号
sed [option] -f sed脚本文件 输入文件 使用sed脚本文件
sed脚本文件 [option] 输入文件 第一行具有sed命令解释器的sed脚本文件
option如下:

n 不打印; sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑),p命令可以用来打印编辑行
c 下一命令是编辑命令,使用多项编辑时加入此选项
f 如果正在调用sed脚本文件,使用此选项,此选项通知sed一个脚本文件支持所用的sed命令,如
sed -f myscript.sed input_file 这里myscript.sed即为支持sed命令的文件
使用重定向文件即可保存sed的输出

使用sed在文本中定位文本的方式:
x x为一行号,比如1
x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
/pattern/ 查询包含模式的行,如/disk/或/[a-z]/
/pattern/pattern/ 查询包含两个模式的行,如/disk/disks/
/pattern/,x 在给定行号上查询包含模式的行,如/disk/,3
x,/pattern/ 通过行号和模式查询匹配行,如 3,/disk/
x,y! 查询不包含指定行号x和y的行

基本sed编辑命令:

命令解释
p 打印匹配行
c\ 用新文本替换定位文本
= 显示文件行号
s 使用替换模式替换相应模式
a\ 在定位行号后附加新文本信息
r 从另一个文本中读文本
i\ 在定位行号后插入新文本信息
w 写文本到一个文件
d 删除定位行
q 第一个模式匹配完成后退出或立即退出
l 显示与八进制ASCII代码等价的控制字符
y 传送字符
n 从另一个文本中读文本下一行,并附加在下一行
{} 在定位行执行的命令组
g 将模式2粘贴到/pattern n/

基本sed编程举例:
使用p(rint)显示行: sed -n ‘2p‘ temp.txt 只显示第2行,使用选项n
打印范围: sed -n ‘1,3p‘ temp.txt 打印第1行到第3行
打印模式: sed -n ‘/movie/‘p temp.txt 打印含movie的行
使用模式和行号查询: sed -n ‘3,/movie/‘p temp.txt 只在第3行查找movie并打印
显示整个文件: sed -n ‘1, generated by haroopad

p temp.txt $为最后一行
任意字符: sed -n ‘/.*ing/‘p temp.txt 注意是.ing,而不是ing
打印行号: sed -e ‘/music/=‘ temp.txt
附加文本:(创建sed脚本文件)chmod u+x script.sed,运行时./script.sed temp.txt

#!/bin/sed -f
/name1/ a\             #a\表示此处换行添加文本
HERE ADD NEW LINE.     #添加的文本内容

插入文本: /name1/ a\ 改成 4 i\ 4表示行号,i插入
修改文本: /name1/ a\ 改成 /name1/ c\ 将修改整行,c修改
删除文本: sed ‘1d‘ temp.txt 或者 sed ‘1,4d‘ temp.txt
替换文本: sed ‘s/source/OKSTR/‘ temp.txt 将source替换成OKSTR
sed ‘s/\$//g‘ temp.txt 将文本中所有的$符号全部删除
sed ‘s/source/OKSTR/w temp2.txt‘ temp.txt 将替换后的记录写入文件temp2.txt
替换修改字符串: sed ‘s/source/"ADD BEFORE" &/p‘ temp.txt 结果将在source字符串前面加上”ADD BEFORE”,这里的&表示找到的source字符并保存
sed结果写入到文件: sed ‘1,2 w temp2.txt‘ temp.txt
sed ‘/name/ w temp2.txt‘ temp.txt
从文件中读文本: sed ‘/name/r temp2.txt‘ temp.txt
在每列最后加文本: sed ‘s/[0-9]*/& Pass/g‘ temp.txt
从shell向sed传值: echo $NAME | sed "s/go/$REP/g" 注意需要使用双引号

快速一行命令:
‘s/\.$//g‘ 删除以句点结尾行
‘-e /abcd/d‘ 删除包含abcd的行
‘s/[][][]*/[]/g‘ 删除一个以上空格,用一个空格代替
‘s/^[][]*//g‘ 删除行首空格
‘s/\.[][]*/[]/g‘ 删除句号后跟两个或更多的空格,用一个空格代替
‘/^$/d‘ 删除空行
‘s/^.//g‘ 删除第一个字符,区别 ‘s/.//g’删除所有的句点
‘s/COL/(...\)//g‘ 删除紧跟COL的后三个字母
‘s/^\///g‘ 删除路径中第一个\

while

while基本用法:

while [ condition ]
do
   command1
   command2
   command3
done

例:

#!/bin/bash
sudo find  -type f -name ‘*.log‘ |while read mvname 
do
mv $mvname ${mvname/.log/.LOG}
done
```language
#!/bin/bash
#查找当前目录下*.log并把值赋于mvname参与循环.
sudo find  -type f -name ‘*.log‘ |while read mvname
do
#移动,并把结尾的.log替换成.LOG /*Ubuntu 下好像不行*/
mv $mvname ${mvname/.log/.LOG}
done

Nagios

Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。

nagios监控LVS脚本
煮酒品茶:ly_cyz应该也是混51CTO的,明天问下他,$(())里是不是有些多余?没联系上自己改下脚本再尝试一下.

#!/bin/bash
#Author: ly_cyz
ACT_COUNT=0
Inactive_count=0
stat1=`sudo ipvsadm | grep http | grep Masq|wc -l`
if [ $stat1 -ne 0 ];then
for NUM in `sudo ipvsadm | grep http | grep Masq | awk ‘{print $5}‘`
do
ACT_COUNT=$(($ACT_COUNT+ $NUM))
done

for NUM in `sudo ipvsadm | grep http | grep Masq | awk ‘{print $6}‘`
do
Inactive_count=$(($Inactive_count+ $NUM))
done
else
echo "LVS CRITICAL, "LVS is Down""
exit 2
fi

if [ $ACT_COUNT == 0 ];then
echo "LVS ok, "0 active connection""
exit 1
else
echo "LVS OK - LVS is running (conn: $ACT_COUNT active, $Inactive_count inactive)|active=$ACT_COUNT;69999;99999;0; inactive=$Inactive_count;69999;99999;0;"
fi

编辑后:

#!/bin/bash
#Author: ly_cyz cwtea v2.0
#去除多一个管道,这个你懂得。减少两个赋值。
stat1=`sudo ipvsadm | grep http |wc -l`

if [ $stat1 -ne 0 ];then
        for NUM in `sudo ipvsadm | grep http  | awk ‘{print $5}‘`
                do
#取消其数值运算。
                ACT_COUNT=$NUM
        done

        for NUM in `sudo ipvsadm | grep http  | awk ‘{print $6}‘`
                do
                Inactive_count=$NUM
        done

else
        echo "LVS CRITICAL, "LVS is Down""
        exit 2
fi

if [ $ACT_COUNT -eq 0 ];then
        echo "LVS ok, "0 active connection""
        exit 1
else
echo "LVS OK - LVS is running (conn: $ACT_COUNT active, $Inactive_count inactive)|active=$ACT_COUNT;69999;99999;0; inactive=$Inactive_count;69999;99999;0;"
fi

查看CPU,内存,网络流量和磁盘I/O

在命令行方式下,如何查看CPU、内存的使用情况,网络流量和磁盘I/O?

  1. 查看CPU使用情况的命令
    vmstat 5 每5秒刷新一次,最右侧有CPU的占用率的数据
    top 然后按Shift+P,按照进程处理器占用率排序

  2. 查看内存使用情况的命令
    free 用free命令查看内存占用情况
    top 然后按Shift+M, 按照进程内存占用率排序

  3. 查看网络流量
    可以用工具iptraf工具
    iptraf -g
    针对某个Interface的网络流量可以通过比较两个时间网络接口的RX和TX数据来获得
    date; ifconfig eth1

  4. 查看磁盘i/o
    iostat -d -x /dev/sdc3 2 用iostat查看磁盘/dev/sdc3的磁盘i/o情况,每两秒刷新一次

@@footer

Shell 学习笔记

标签:

原文地址:http://www.cnblogs.com/liang3p/p/4819748.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!