Linux目录结构:
bin (binaries)----------------> 存放二进制可执行文件
sbin (super user binaries)----> 存放二进制可执行文件,只有root才能访问
etc (etcetera)-----------------> 存放系统配置文件
usr (unix shared resources)—> 用于存放共享的系统资源
home --------------------------> 存放用户文件的根目录
root -------------------------> 超级用户目录
dev (devices)------------------> 用于存放设备文件
lib (library)-----------------> 存放跟文件系统中的程序运行所需要的共享库及内核模块
mnt (mount)-------------------> 系统管理员安装临时文件系统的安装点
boot --------------------------> 存放用于系统引导时使用的各种文件
tmp (temporary)---------------> 用于存放各种临时文件
var (variable)----------------> 用于存放运行时需要改变数据的文件
Linux常用命令:
hostname ---------------> 查看主机.
ifconfig ----------------> 查看ip地址.
ping ip地址 -------------> 测试网络的连通性 ip 192.168.3.4
shutdown ---------------> 系统关机.
-r 关机后, 立即重启.
-h 关机后, 不重新启动.
halt --------------------> 关机后,关闭电源.
reboot ------------------> 重新启动.
crtl c ---------------> 停止当前进程.
history-----------------> 查看命令历史.
crtl l ----------------> 清屏.
clear-------------------> 清屏.
su ---------------------> 切换用户,低权限用户切换时,默认切换为root, 需要输入密码. 高权限切为低权限需要指定用户名.
top --------------------> 显示当前系统中耗费资源最多的进程
ps ---------------------> 显示瞬间的进程状态
-e /-A 显示所有进程,环境变量
-f 全格式
-a 显示所有用户的所有进程(包括其它用户)
-u 按用户名和启动时间的顺序来显示进程
-x 显示无控制终端的进程
ps -ef | more ---------> 查看进程
kill -9 pid值 ----------> 杀死一个进程 , kill -9 3727
df ---------------------> 显示文件系统磁盘空间的使用情况.
free--------------------> 显示当前内存和交换空间的使用情况
netstat ----------------> 显示网络状态信息
-a 显示所有连接和监听端口
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-p 显示建立相关链接的程序名
netstat -an | grep 8080 -----> 查找8080端口的程序.
ls -la /usr ------------> 查看文件和目录列表. ls -lt /usr , ls -l /usr , ls -a /usr , ll(查看默认目录内容)
-a 显示所有,包括隐藏文件.
-l 以长列表形式显示long.
ls -lhR mnt/ ----> 表示查看大小, R表示递归查看, 可以查看mnt下的所有的文件夹及文件.
cd /usr --------------> 切换目录 , cd . , cd … , cd /usr/local/java , cd 跳出当前环境.
cd - -----------------> 返回进入此目录之前所在的目录
cd !$ ----------------> 把上个命令的参数作为cd参数使用。
pwd --------------------> 查看当前工作目录.
help + 命令 ------------> 内部命令, 查看帮助文档. eg: help cd
man + 命令 ------------> 外部命令, 查看文档帮助. eg: man ls
mkdir 文件目录 --------> 创建文件目录 mkdir /usr/local/jdk , mkdir /hello ,
创建项目的目录结构:
mkdir -vp scf/{lib/,bin/,doc/{info,product},logs/{info,product},service/deploy/{info,product}}
创建的目录结构如下:
scf/
|-- bin
|-- doc
| |-- info
| -- product |-- lib |-- logs | |-- info |
– product
-- service
– deploy
|-- info
`-- product
mkdir room-1,room-2,room-3 , 可以一次性创建多个目录.
mkdir -p 文件目录 -----> 创建文件目录, 父目录不存在, 先创建父目录. mkdir -p /java/jdk7
mkdir -m 777 dirname ----> 创建权限为777的文件目录.
cp 文件 目录 ---------> 复制文件到目录下. cp book room-a, 复制book文件, 并放在room-a目录下.
cp -r 目录/文件 目录--------> 递归处理,将指定目录下的文件与子目录一并拷贝 . cp -r /usr/java /family/room , 将java下的左右内容复制到room下.
touch:
1). touch 文件 ------------> 创建一个空文件. touch book , 创建一个文件book.
2). touch -r file1.log file2.log -----> 更新file2.log的时间戳与file1.log的时间相同.(file1.log的时间戳不变)
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
3). touch -t 201502072137.50 file3.log ----> 手动设定文件的时间戳.
-t time : 使用指定的时间值 time 作为指定文件相应时间戳记的新值.此处的 time规定为如下形式的十进制数: [[CC]YY]MMDDhhmm[.SS]
echo ‘内容’ > 文件名----> 在创建文件时, 添加文件内容. echo ‘think in java’ > book, 创建book文件时, 添加内容"think in java".
echo ‘content’ > filename -----> 往文件中追加信息.
文件 -----------------> 创建一个空文件, 与touch 效果相同.
mv :
1). 文件改名 : mv test1.log test2.txt ----> 将test1.log 名字改为 test2.txt
2). mv dir1 dir2 ---------> 如果目录dir2不存在,将目录dir1改名为dir2;否则,将dir1移动到dir2中。
3). mv 目录/文件(*) 目录 --> 将目录或文件,移动到另一个目录中.
4). mv book room-a room-c/ , 将文件book及目录room-a移动到room-c目录中.
eg: mv * ../ -----> 将本目录下的内容全部移动到上一级目录.
5). mv -t /opt/soft/test/test4/ log1.txt log2.txt log3.txt 命令将三个文件移动到test4目录中去
-t: 加上这个, 就可以将目录放在前面, 文件放在后面.
rm 目录 ---------------> 移除文件. rm room , 删除文件, 会有确认, 移除目录, 只能移除空目录.
-r 同时删除该目录下的所有文件(recursive),递归删除
-f 强制删除文件或目录(force)
rm -rf room , 移除room目录及其中的所有内容.
rmdir 空目录------------> 删除空目录.
cat :
1). cat 文件 ---------------> 查看文件中的信息, 全部显示. cat install.log , 查看其全部信息, 全部显示.
参数:
-A, --show-all 等价于 -vET
-b, --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E, --show-ends 在每行结束处显示 $
-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号
-s, --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行
-t 与 -vT 等价
-T, --show-tabs 将跳格字符显示为 ^I
-u (被忽略)
-v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外
2). cat > filename ----------> 从键盘创建一个文件,只能创建新文件,不能编辑已有文件.
3). 将几个文件合并为一个文件: cat file1 file2 > file .
cat 1.txt 2.txt > new.txt -------> 将1.txt和2.txt文件的内容合并到new.txt文件中, 前提是new.txt文件是存在的.
4). tac file1.log ------> 反向列示, 就是讲文件的内容从后向前, 倒过来显示.
5). here doc 来生成文件.
cat > 1.log << eof
> ...
> ...
>eof
--------> 系统会将...键盘接受的输入的内容输出到文件1.log中, eof为开始和结束标志, 注意语法.
nl 命令:
1). nl file.log --------------> 带行号查看文件, 如果为空行, 则不计算该行的行号
2). nl -b a file.log ---------> 带行号查看文件, 如果该行为空行, 也计算该行的行号.
3). nl -n ln file.log --------> 在屏幕的最左方显示行号.
4). nl -n rn file.log --------> 在屏幕的最右方显示行号.
5). nl -n rz file.log --------> 行号在自己栏位的最右方显示,且加 0 ;
more/less 文件 ---------> 分页显示文件内容. more install.log
1). more +5 file.log ------------> 查看文件file.log自第五行之后的文件内容.
2). more +/day3 log2012.log -----> 从文件中查找第一个出现"day3"字符串的行,并从该处前两行开始显示输出
3). more -10 menu.sh ------------> 设定每屏显示行数
4). ls -l | more -5 ------------> 列一个目录下的文件,由于内容太多,我们应该学会用more来分页显示。这得和管道 | 结合起来
-------> 每页显示5个文件信息,按 Ctrl+F 或者 空格键 将会显示下5条文件信息。
head/ tail --------------> 查看文本中开头或结尾部分的内容,默认显示十行. head install.log, tail install.log.
tail -n 5 install.log----> 查看文本的末尾的5条数据.
tail -f install.log----> 循环读取文本中的数据.
wc install.log-----------> 统计文本的行数、字数、字符数. // 920 1853 39317 install.log
-m 统计文本字符数 -w 统计文本字数(word) -l 统计文本行数(line)
wc -m install.log wc -w install.log wc -l install.log
find 指定目录(选) -name 文件/目录名—> 在文件系统中查找指定的文件 , 指定目录可以不填.
find -name book , 将从文件系统中查找所有的book的路径
grep ‘内容’ 文件 ---------------> 在指定的文本文件中查找指定的字符串 . grep ‘java’ book.
ln -s family/room-c/ link -------> 建立链接文件
-s 对源文件建立符号连接,而非硬连接
time [command] ----> 查看指定命令的执行时间.
which 命令:
1). which 查看可执行文件的位置。
which pwd ----------> /bin/pwd
which useradd ------> /usr/sbin/useradd
2). whereis 查看文件的位置。
3). locate 配合数据库查看文件位置。
4). find 实际搜寻硬盘查询文件名称。
5). which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
gzip 文件 ------------------------> 压缩(解压)文件或目录,压缩文件后缀为gz
-d将压缩文件解压(decompress)
-l显示压缩文件的大小,未压缩文件的大小,压缩比(list)
-v显示文件名和压缩比(verbose)
-num用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),
-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6
eg: gzip install.log , 压缩. gzip -d install.log.gz, 解压.
gzip -9 install.log , 高压缩比压缩.
bzip2 文件 -----------------------> 压缩(解压)文件或目录,压缩文件后缀为bz2
-c将压缩的过程产生的数据输出到屏幕上
-d解压缩的参数(decompress)
-z压缩的参数(compress)
-num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),
-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6
bzip2 install.log, 压缩. bzip2 -d install.log.bz2, 解压.
tar 文件-------------------------> 文件、目录打(解)包
-c 建立一个压缩文件的参数指令(create)
-x 解开一个压缩文件的参数指令(extract)
-z 是否需要用 gzip 压缩
-j 是否需要用 bzip2 压缩
-v 压缩的过程中显示文件(verbose)
-f 使用档名,在 f 之后要立即接档名(file)
tar -czvf ff.tar.gz family/, 将文件解压到family目录下.
nohup -----> 不挂断的运行命令. 如: nohup java -jar sendMessage.jar & —> & 表示后台运行,需要加上
----> 后台运行, 原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。
nohup command > myout.log 2>&1 & ----> 也可以指定输出日志的文件 , 2>&1 表示错误输出也指向正常日志, 也就是, 错误正确都指向这个日志文件.
VIM/VI 文本编辑器:
vim install.log ----> 进入文本详情:
i ----------> 在光标前插入.
I ----------> 在光标当前行开始插入.
a ----------> 在光标后插入.
A ----------> 在光标当前行末尾插入.
o ----------> 在当前行的下一行插入新的空行.
O ----------> 在当前行的上一行插入新的空行.
:set nu-----> 显示行号.
:set nonu---> 取消行号.
gg----------> 到文本的第一行.
G-----------> 到文本的最后一行.
:n----------> 到文本的第n行.
x-----------> 删除光标所在处的字符.
nx----------> 删除光标所在处后的n个字符.
dd----------> 删除光标所在行
ndd---------> 删除n行.
dG----------> 删除光标所在行到末尾行的所有行.
D-----------> 删除光标所在处到行尾的内容.
:n1,n2d ----> 删除指定范围的行.
u-----------> 取消上一步操作.
crtl+r------> 返回到undo之前.
r-----------> 替换光标坐在处的字符.
R-----------> 从光标所在处开始替换,按esc键结束.
shift+zz ---> 保存退出
:wq --------> 保存并退出,与上述作用相同.
:x ---------> 保存并退出
:q! --------> 不保存退出
v 或 shift+v----> 进入行可视模式.
crtl+v -----> 进入块可视模块.
用户与账户管理:
/etc/passwd ----------------> 保存用户信息的文件:
/etc/shadow ----------------> 保存密码的文件
/etc/group -----------------> 保存用户组的文件
/etc/gshadow ---------------> 保存用户组密码的文件
/etc/default/useradd -------> 用户配置文件
查看其中的内容就可以使用: cat , more, less, tail, head.
操作用户命令:
--------------------------------> account:password:UID:GID:GECOS:directory:shell <-----------------------
添加用户命令:useradd username-----> 添加用户. useradd lisi
-u 指定组ID(uid)
-g 指定所属的组名(gid)
-G 指定多个组,用逗号“,”分开(Groups)
-c 用户描述(comment)
-e 失效时间(expire date)
查看用户的命令: id username --> id root ===> uid=0(root) gid=0(root) groups=0(root) ;
查看系统的所有的用户信息: cat /etc/passwd --> 对于普通用户, uid都是从500开始排的.
设置密码命令: passwd username---------> 为哪个用户设置密码, eg: passwd lisi—> 为lisi用户设置密码.
ll /home/ ----------> 查看用户及组.
cat /etc/passwd-----> 查看用户信息.
cat /etc/shadow ----> 查看当前系统中的账户的密码信息.
cat /etc/group ----> 查看当前用户的组信息.
修改用户命令:usermod(user modify)
-l 修改用户名 (login)usermod -l a b(b改为a) ----------- eg : usermod -l LiSi zhangsan 将用户名张三修改为LiSi.
-g 添加组 usermod -g sys tom
-G添加多个组 usermod -G sys,root tom
–L 锁定用户账号密码(Lock)
–U 解锁用户账号(Unlock)
删除用户命令:userdel(user delete) —> 删除用户的同时,会删除该用户的组,密码, home下的所有信息.
-r 删除账号时同时删除目录(remove)
查看系统中组的信息: cat /etc/group
添加组:groupadd
-g 指定gid
修改组:groupmod
-n 更改组名(new group)
删除组:groupdel
groups 显示用户所属组
将用户添加到组中:
gpasswd -a user1 root -----> 将用户user1 添加到root组中. 一个用户可以同时属于多个组. 该用户的权限, 是两个组的权限之和.
把组中的用户删除:
gpasswd -d user1 root -----> 将root组中的user1用户删除.
权限管理:
三种基本权限
r 读权限(read)
w 写权限(write)
x 执行权限 (execute)
d r w x r - x r - x - r w - r - - r - - l r w x r w x r w x
第1位:文件类型(d 目录,- 普通文件,l 链接文件)
第2-4位:所属用户权限,用u(user)表示
第5-7位:所属组权限,用g(group)表示
第8-10位:其他用户权限,用o(other)表示
第2-10位:表示所有的权限,用a(all)表示
完整信息:一个文件,所属用户具有读写执行权限;所属组的用户
有读写权限,没有执行权限;其他用户只有读权限
//------- chmod 权限分配
chmod修改文件权限命令(change mode)
参数:-R 下面的文件和子目录做相同权限操作(Recursive递归的)
-----> chmod u+x a.txt --- 增加权限 | chmod u-x a.txt ---- 减少权限
-----> chmod g+x a.txt --- 增加权限 | chmod g-x,g-w a.txt ---- 减少权限
-----> chmod a+x a.txt
用数字来表示权限(r=4,w=2,x=1,-=0)
-----> chmod 750 b.txt
rwx用二进制表示是111,十进制4+2+1=7
r-x用二进制表示是101,十进制4+0+1=5
7 5 0
1 1 1 1 0 1 0 0 0
r w x r _ x - - -
// ----------- acl 权限 ------
1). getfacl root.txt ----> 获取文件的权限信息. 返回文件名,文件拥有者, 所属组, 用户权限,组权限,其他权限.
2). setfacl -m u:deng:rw root.txt ----> 为用户deng分配root.txt文件的权限. -m表示更改modify
3). setfacl -x u:deng root.txt -----> 删除给deng这个用户层设置的所有权限. 通过acl设置的权限.
4). setfacl -b root.txt --------------> 擦除给文件root.txt上的所有的acl权限.
setfacl -bR deng ------> 遍历擦除deng文件夹下的所有的acl权限.
5). linux中的文件如果没有执行(x)的权限, 是不能切换到该目录下的. 切换的瞬间是执行该文件夹.
6). 如果要在目录下 删除/创建 一个文件, 需要对该目录设置权限.
setfacl -m u:deng:rwx /mnt
7). 如何对一个目录及子目录和文件设置权限:
setfacl -m u:deng:rwx -R /mnt -----> -R 表示, 递归设置权限.
---> 这样设置是可以解决当前目录下当前所有文件的acl权限, 但是后期新加的子目录和文件, 无法继承父目录的权限.
解决方法:
①. setfacl -m u:deng:rwx -R /mnt ----> 给现有是目录文件递归添加权限.
②. setfacl -m d:u:deng:rwx -R /mnt ----> 给目录做默认权限操作.
//----------- visudo 权限 --------------
设置用户对命令的执行权限-visudo ----> sudo授权.配置中配置.
- 设置
visudo ----> 进入权限设置文件配置.
下列这种方式需要密码:
①. user1 locahost=/usr/sbin/useradd —> 给user1分配useradd命令的执行权限.
②. user1 localhost=/usr/sbin/userdel —> 给user1分配userdel命令的执行权限.
下列的这种方式不需要使用密码:
user1 ALL = NOPASSWD:/usr/sbin/useradd —> 不需要当前用户输入密码.
user1 localhost = NOPASSWD:/usr/sbin/useradd —> 不需要当前用户输入密码.
2.使用sudo授权的命令, 需要在命令前加上sudo
sudo /usr/sbin/useradd user2
sudo /usr/sbin/userdel -r user2
- 使用无密码的sudo授权命令
rpm命令使用:
rpm的常用参数:
i:安装应用程序(install)
e:卸载应用程序(erase)
vh:显示安装进度;(verbose hash)
U:升级软件包;(update)
qa: 显示所有已安装软件包(query all)
结合grep命令使用
ex:rpm -ivh 3.el6.x86_64.rpm -C /usr/java-------> 直接安装.
rpm -Uvh xxxxxxxxxxx.rpm -C /usr/java -------> 更新升级安装包.
tomcat的安装:
解压: tar -zxvf apache-tomcat-7.0.47.tar.gz -C /usr/local/src/
启动tomcat:
1). cd /usr/local/src ----> [root@itcast01 src]# ./
2). cd /usr/local/src ----> [root@itcast01 src]# sh apache-tomcat-7.0.47/bin/startup.sh --- > 推荐.
3). [root@itcast01 bin]# sh startup.sh ---> 这种可以推荐使用.
防火墙:
service iptables status; --------> 查看防火墙.
service iptables stop; ----------> 关闭防火墙.
source /etc/profile----------------------> 刷新文件. 当配置文件修改时, 需要刷新文件.
IP地址的配置:
1). 直接通过图形化界面, 来配置ip地址.
2). 通过setup指令, 进入网络设置.
3). vim /etc/sysconfig/network-scripts/ifcfg-eth0
vim /etc/sysconfig/network ----------> 修改hostname.
vim /etc/hosts-----------------------> 配置hosts.系统内部的DNS
yum -y install mysql-server ----------> 联网自动下载需要安装的软件. -y 表示提示安装过程.
yum update ----> 全部更新
yum check-update -----> 检查可更新的程序.
//--------------------------------- Shell 脚本编程 ------------------------------
-
历史命令
history 查看历史命令;
! 指定的命令索引, 可以调用该命令 !5 --> 执行第五条命令 !vi --> 调用历史中最后一次使用vi开头的命令. !ser --> 执行历史中最后一次执行的ser*开头的命令
history -c 清除历史命令
init 0 关闭系统
tr —> 转换字符, 如: 将大写转为小写,选项可以让你指定所要删除的字符,以及将一串重复出现的字符浓缩成一个.
-
命令别名
alias x=‘ll’ —> 给命令起别名, 然后可以使用简短的别名操作
---> 这样的别名, 服务器重新启动后就会失效 ; 持久化, 可以将其存储在 .bashrc文件中
alias —> 查看系统中的所有的命令的别名.
unalias x —> 清除指定的别名.
-
输出重定向
ll >> root.txt -----> bash输出重定向. 将查找到的数据放在root.txt文件中.
和 >> 的区别:
1).都是重定向, > 是覆盖式重定向, >> 是追加式重定向.
1> 和 2> 的区别:(覆盖式) 1>> 2>> (追加式)
1). 1> 是正确重定向, 如果前面的命令是正确的, 将该命令的返回结果存储在指定的文件中. 2). 2> 是错误重定向, 如果前面的命令是错误的, 将该命令的返回结果存储在指定的文件中.
&> 把正确的或者错误的输出结果存储在文件中. (是覆盖式的输出, 并非追加式输出)
bash red.sh 1>>note.txt 2>&1 —> 将正确的输出结果存在note.txt中,将错误的结果也通过1的通道存储在note.txt中, 而且还是追加.
< 输入数据.
-
shell的管道操作.
free -m | grep -i mem ----> 通过管道|, 将前面的查询结果, 交给后面, 由后面的grep来过滤.
--> 1). free 查看内存信息, -i 表示忽略大小写匹配, grep 表示查找.
free -m | grep -i mem | awk ‘{print $1"\n",$2"\n",$3"\n",$4"\n"}’; ----> 此处使用了awk编程. "\n"表示换行 , 查找指定的列.
-
执行shell脚本的方式:
1). bash test.sh -----> 不需要再文件中写解析器
-----> 不需要给脚本设置执行权限2). ./test.sh -----> 需要些解析器
-----> 需要给脚本设置执行权限. -
crontab LINUX下的任务调度:
格式: * * * * * *
分 时 日 月 周 命令30 21 * * * /usr/local/etc/rc.d/lighttpd restart
----> 上面的例子表示每晚的21:30重启apache30 17 * * 5 /opt/deng/test.sh
----> 表示每周五17:30执行test.sh脚本;
vi crontab ----> 可以将定时任务放在crontab中,linux会定时执行这里的任务.
printf 与 echo的功能基本相同, 只是printf不会自动换行,需要"\n"来操作换行 , 这两个命令的标准不同.
printf “this is a test program , %s , %s \n” Hello world --------> this is a test program , Hello , world
与C语言中的printf用法很相似.
-
变量的定义: 变量的引用 $
1). shell 中的变量只能以 字母 或者 下划线_ 开头, 并且字母区分大小写.
2). 在LINUX下的, 所有的文件名, 路径都是区分大小写的.
3). 变量可以使用双引号"", 也可以使用单引号’’, 都可以使用
name=“dengchangtao” —> 注意,这里的空格都会影响执行的结果.
echo $name ----> 变量可以直接引用输出.
echo “my name is $name” ----> “my name is dengchangtao” 变量也可以在一段话中输出.
echo “my name is $nameDeng” ----> "my name is " 这种方式不能正常输出, 会寻找变量nameDeng, 不能自动识别.
echo "my name is n a m e D e n g " − − − − > " m y n a m e i s d e n g c h a n g t a o D e n g " − − − > 可 以 通 过 {name}Deng" ----> "my name is dengchangtaoDeng" ---> 可以通过 nameDeng"−−−−>"mynameisdengchangtaoDeng"−−−>可以通过{}将变量封装在{}中引用输出.
-
read -p ---------> 接受键盘输入事件 : /*** read [-p “信息”] 变量名
$name ----> 表示变量name, $ 引用变量.
read -p “please input your name :” name -----> 读取键盘事件接受到的内容, 将其赋值给变量name
echo “my name is $name”
-
name=“dengchangtao”
echo $name
echo ‘my name is $name’ —> my name is $name —>
-
1). 单引号 ‘’ 是不能解析变量的. ‘my name is $name’ —> 其中的name变量是不能被解析的.
2). 双引号 “” 可以解析变量. “my name is $name” —> 其中的name变量是可以解析的.
3). 反引号 `` 可以将其中的命令,输出的结果,返回给前面的变量. —> str =
echo dengchangtao
echo “$str” ----> “dengchangtao”-----> num=
expr 1 + 2 + 3
—> 将表达式的执行结果, 赋值给变量num. -
date ----> linux 命令可以直接输出当前的日期时间.
set -x -----> 打开shell脚本的执行跟踪功能;
set +x -----> 关闭shell脚本的执行跟踪功能.
-
unset 变量名 —> 清除变量.
name=“dengchangtao”
echo $name —> dengchangtao
unset name
echo $name —> 没有输出内容 -
位置变量:
$n n<9 —> $1 $2 $3 $4 $5 $6 $7 $8 9 − − > 位 置 变 量 就 只 要 这 9 个 . 可 以 超 过 10 , 十 个 以 上 , 引 用 变 量 就 需 要 使 用 9 --> 位置变量就只要这9个. 可以超过10,十个以上,引用变量就需要使用 9−−>位置变量就只要这9个.可以超过10,十个以上,引用变量就需要使用{10},需要{}括号括起来.
echo $1
echo $2
echo $3sh test.sh 11 22 33 —> 一次输出11 , 22 , 33
-
位置变量的使用案例; --> case in esac 语句的使用. 注意语法格式.
case $1 in
start)
echo “this is starting…”
;;
stop)
echo “this is stoping…”
;;
esac
-
linux 中是不支持 echo 1+2 这种直接运算操作的, 会原样输出
echo $(( $1+$2 )) —> 这种语法可以解析. 输出变量1和变量2 之和.
expr 10 + 20 —> 可以解析运算符. 注意 "+"的左右是有空格的, 否则会报错.
expr 10 - 20 ,expr 10 \ 20,expr 10 * 20,expr 10 % 20 ----> * 是特殊字符, 需要转义.
-
预定义变量:
1). $# : 命令行中位置参数的个数
2). $* : 所有位置参数的内容
3). $? : 上一条命令执行后返回的状态, 当返回的状态值为0是,表示
执行正常,非0值表示执行异常或者出错4). $0 : 当前执行的进程或者程序名.
eg:
#!/bin/bash
#deng
echo "参数的个数为:$#"------> 可以直接写 $#
echo "参数分别是$*"
echo "该执行的文件名或者程序名是:${0}" ------> 也可以写 ${0}, ${#} , ${?} ,${*}
echo ${?}
eg2:
total=0
for i in $*; do ----> for循环,i表示遍历到的变量.
∗
表
示
所
有
的
参
数
.
t
o
t
a
l
=
*表示所有的参数. total=
∗表示所有的参数.total=((
i
+
i+
i+total )) ----> 遍历获取动态参数的值.
done
echo $total
eg3:
ls
if [[ $? == 0 ]]; then
echo “上条命令执行成功, 执行成功就是返回0”
else
echo “上条命令执行失败,执行失败返回非0”
fi
=====>> 注意: 这里检测命令是否正常执行, 当使用简写命令时,将提示命令错误, 执行不成功. 如 ll --> 执行失败.
-------- shell的输入, 输出 -------
-
echo -e “my name is user1\nmy name is user2”; ---------------> \n 表示换行.
-
echo -e “\033[32;40m[ok]\033[0m” --------------> 设置字体颜色. 注意: 颜色部分用双引号包括.
\033[前景颜色;背景颜色m
\033[0m —> 系统默认颜色.前景颜色: 30 黑色,
31 红色
32 绿色
33 棕色
34 蓝色
35 紫色
36 青色
37 白色背景颜色: 40 黑色
41 红色
42 绿色
43 棕色
44 蓝色
45 紫色
46 青色
47 白色
/-------------- 文件测试 和 整形测试 --------------
-
测试文件的状态:
格式: [ 操作符 文件或目录 ] ---------> 执行结果为真,则返回0, 如果为假, 则返回非0 ;
-
常用的测试操作符
1). -d: 测试是否为目录(Disctory) ;
2). -e: 测试目录或文件是否存在(Exist);
3). -f: 测试是否为文件(File);
4). -r: 测试当前用户是否具有权限读取(Read);
5). -w: 测试当前用户是否具有权限写入(Write);
6). -x: 测试当前用户是否可以执行(Excute);
7). -L: 测试是否为符号链接(Link)文件; -
条件测试在shell脚本中的使用:
#!/bin/bash
#dengif [ -f ./file1 ]
then
echo “file1 is exists”
else
echo “file1 is not exists”
touch file1
fi----> 判断文件file1是否存在,如果存在则输出 “file1 is exists”, 如果不存在,则输出"file1 is not exists" ,并创建文件.
-
挂载和未挂载:
mount —> 挂载
mount /dev/cdrom/media ----> 挂载光盘 在挂载光盘时,会输出许多挂载光盘是的日志信息, 可以屏蔽掉 mount /dev/cdrom/media &> /dev/null -----> 屏蔽掉信息,也就是将其输出重定向到null这个黑洞中.
unmount ----> 未挂载.
unmount /dev/cdrom/media ----> 未挂载光盘
-
整型数据的比较:
格式: [ 整数1 操作符 整数2 ]
0). 操作符:
1). -eq : 等于 (Equal)
2). -ne : 不等于(Not Equal)
3). -gt : 大于(Greater Than)
4). -lt : 小于(Lesser Than)
5). -le : 小于等于(Lesser or Equal)
6). -ge : 大于等于(Greater or Equal)1). who 查看当前系统中登陆的用户;
root pts/0 2015-01-13 06:37 (192.168.3.4) root pts/1 2015-01-13 06:38 (192.168.3.4)
2). who -l 系统当前登陆用户的信息.
LOGIN tty3 2015-01-13 06:36 2210 id=3 LOGIN tty2 2015-01-13 06:36 2208 id=2 LOGIN tty4 2015-01-13 06:36 2212 id=4 LOGIN tty5 2015-01-13 06:36 2218 id=5 LOGIN tty6 2015-01-13 06:36 2220 id=6
3). who | wc -l ; 登陆的用户的数量. 是一个数字, 也就是几条数据.
who | wc -l ----> 4
4). [
who | wc -l
-ge 2 ]&& echo “当前用户已被入侵…” ----> 打印 “当前用户已被入侵…”---> 注意其中的空格.
5). 使用shell脚本编写程序:
#!/bin/bash #deng if [ `who | wc -l ` -ge 2 ] then echo "当前登陆用户系统的人数大于等于两人,可能被入侵..." else echo "当前登陆用户系统的人数小于等于两人" fi
6). df -Th -----> linux的文件挂载情况; 或系统的分区情况.
7). df -Th | grep boot ----> 从df -Th的查询结果中查找出boot , 分区的使用系统.
/dev/sda1 ext4 291M 34M 242M 13% /boot
8). df -Th | grep boot | awk ‘{print $6}’| cut -d ‘%’ -f1 —> 13
----> $6 , 表示第六个参数. ----> cut -d '%' , 表示以"%"进行分割. ----> -f1 , 表示取第一部分.
9). 例子:
#!/bin/bash
#dengbootspace=`df -Th | grep 'boot' | awk '{print $6}' | cut -d '%' -f1` if [ $bootspace -ge 14 ] then echo "boot分区的使用空间已经大于等于14%" | mail -s 'boot space Warning!!!' root@localhost else echo "boot分区的使用空间已经xiao于等于14" fi
10). ls -lh ----> 可以将查看的文件的大小, 让其显示成单位为M.
11). mail ----> 打开linux下的邮件系统.
12). & 后面跟上数字, 就可以查看第几封邮件 ; &1 , &2 —> 打开第一封 , 第二封邮件.
13). q ----> 退出邮件系统.
-
字符串测试和逻辑测试:
1). 字符串比较:
格式: [ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2 ] [ -z 字符串 ] -------> 字符串为空. 常用的测试操作符: =: 字符串内容相同 !=: 字符串内容不同,!表示相反的意思 -z: 字符串内容为空
2). read -p ‘name:’ name —> 提示name,键盘输入名称, 将输入的值赋给变量name.
3). 字符串判别, shell实例: ----> if条件判断下面的这两种写法都是可以的.
①. #!/bin/bash #deng read -p 'please input your name :' name read -p 'please input your pass :' pass if [[ 'deng' = $name && '1234' = $pass ]] then echo "Login success ! " else echo "Login failure !" fi ②. #!/bin/bash #deng read -p 'please input your name :' name read -p 'please input your pass :' pass if [ 'deng' = $name ] && [ '1234' = $pass ] then echo "Login success ! " else echo "Login failure !" fi ---> shell执行: please input your name :deng please input your pass :1234 Login success !
4). 逻辑测试:
格式: [ 表达式1 ] 操作符 [ 表达式2 ] 常用的测试操作符: ①. -a 或 && 逻辑与, '而且'的意思 ②. -o 或 || 逻辑或,'或者'的意思 ③. !: 逻辑否, 当指定的条件不成立时, 返回的结果为真.
-
流程控制.
1). if条件判断
eg1: -------------> 双分支结构if [ $1 -lt 60 ] echo '小于60' else echo '大于60' fi
eg2: -------------> 多分支结构.
#/bin/bash
#deng#成绩级别 #60以下 #60-75之间 #75-90之间 #90以上 if [ $1 -lt 60 ];then echo '此成绩不及格啊,得努力!!' elif [ $1 -ge 60 ]&&[ $1 -lt 75 ];then echo '此成绩是个中等成绩,加油!!' elif [ $1 -ge 75 ]&&[ $1 -lt 90 ];then echo '此成绩是个比较优秀的成绩,fighting!!' else echo '此成绩是个给非常好的成绩!' fi ---> ./0118.sh 78 ==> '此成绩是个比较优秀的成绩,fighting!!'
eg3: —> eg2中的判定有些多余, 可以精简如下:
if [ $1 -lt 60 ];then echo '此成绩不及格啊,得努力!!' elif[ $1 -lt 75 ];then echo '此成绩是个中等成绩,加油!!' elif[ $1 -lt 90 ];then echo '此成绩是个比较优秀的成绩,fighting!!' else echo '此成绩是个给非常好的成绩!' fi ----> 因为流程判断时,从上面往下走,结果只能是一个,不能是多个.
2). case条件判断, 相当于其他语言中的switch.
①. 注意语法格式, 以case开始,esac结束, 每一个条件判断中间,以";;"分割开.:
case $1 in
1 )
echo ‘周一’
;;
2 )
echo ‘周二’
;;
3 )
echo ‘周三’
;;
4 )
echo ‘周四’
;;
* )
echo ‘其他’ -------> 如果不符合上述的任何条件,则进入该条件中.
;;
esac:
week=date +%w
case $week in
1 )
echo ‘周一’
;;
2 )
echo ‘周二’
;;
3 )
echo ‘周三’
;;
4 )
echo ‘周四’
;;
* )
echo ‘其他’ -------> 如果不符合上述的任何条件,则进入该条件中.
;;
esac====> 日期格式化命令.
②. date +%w ----> 查看当前是星期几
③. date +%d -----> 可以查看当前是几号
④. date +%m -----> 查看当前的月份.
⑤. date +%M -----> 查看当前的月份.:
case $1 in start ) `net start mysql` ----> 如果传入的是start, 则启动mysql ;; stop ) `net stop mysql` ----> 如果传入的是stop, 则停止mysql ;; * ) echo 'command not found' ;; esac ---> 这样就可以在shell后面加上 位置参数启动mysql.
-
循环控制.
1). while … do … done 循环
**** 注意 while条件判断后面是有个空格的.
eg1:
#/bin/bash
#dengnum=10 //注意while后面的空格. while [ $num -gt 0 ] -------------> 符合条件执行do之后的代码. 执行完毕之后,执行done的代码. do echo $num num=$(($num-1)) done echo '最后一个num是'$num
eg2:
//求连续数字的和.
num=100
tot=0while [ $num -gt 0 ] do tot=$(($tot+$num)) num=$(($num-1)) done echo $tot
eg3:
i=0
while [ i − l t 5 ] d o u s e r a d d u s e r i -lt 5 ] do useradd user i−lt5]douseradduseri
echo ‘123’|passwd --stdin user i i = i i= ii=(($i+1))
done语句解读: useradd user$i ----> 循环遍历创建用户. echo '123'|passwd --stdin user$i -----> 将123输出的结果,通过管道作为密码,并作为标准输出流 赋给用户.
eg4: — 隔行换色, while结合if语句. [[]] (()) 的嵌套使用,是为了转义,这样在shell中就可以直接使用运算符了
i=0
while [[ $i -lt 10 ]]; do
if [[ $i%2 -eq 0 ]]; then / if [ ( ( (( ((i%2)) -eq 0 ]]; then
echo -e “\033[32;43m${i}\033[0m”
else
echo i f i i = i fi i= ifii=(($i+1))
done2). for循环
①. 针对于操作系统中的操作 , for ..in是非常实用的. <eg1:> for .. in .. 循环: #/bin/bash #deng for i in user0 user1 user2 user3 user4 ; do echo $i done --------------------------------------------- #/bin/bash #deng for i in `cat user.txt` ; do echo $i useradd $i done ----> 将文件user.txt中的数据读出来,以空格分开. <eg2:> --> 将系统中所有的用户信息的用户名部分,输出到一个文件中. for i in `cat /etc/passwd | awk -F: '{print $1}'` ; do echo $i echo $i >> user.txt done --> 解析命令: cat /etc/passwd | awk -F: '{print $1}' **: /etc/passwd ---> 该目录下存放的是用户的信息. **: -F: -----------> 表示以第一个:分开. **: '{print $1}'---> 表示输出第一个参数. ②. 普通的for 循环: for 循环类似于java中的for循环, ((初始条件;判断条件;执行后操作)) <eg1:> #/bin/bash #deng for (( i = 0; i < 10; i++ )); do echo $i sleep 1 done <eg2:> #/bin/bash #deng for (( i = 0; i < 10; i++ )); do echo $i useradd user$i echo 1234 | passwd --stdin user$i done <eg3:> for (( i = 0; i < 10; i++ )); do echo $i sleep 1 if [ $i -eq 5 ]; then break; // continue --------> break , continue 和java中for循环中的作用相同. fi done ③. 接受键盘输入, 并判定键盘上的键的类型, [a-z][A-Z] [0-9] #/bin/bash #deng read -p 'please input your one key :' key case $key in [a-z][A-Z]) echo '字母键!' ;; [0-9]) echo '数字键!' ;; *) echo '功能键!' ;; esac
-
shift 迁移语句:
1). 用户迁移位置变量,将$1~$9依次想左传递:
①. 例如,若当前脚本程序获得的位置变量如下: $1=file1 , $2=file2 , $3=file3 , $4=file4 ②. 则执行依次shift命令后,各位置变量为: $1=file2 , $2=file3 , $3=file4 ③. 再次执行shift命令后, 各位置变量为: $1=file3 , $2=file4
例1 :
#/bin/bash
#dengtot=0 while [ $# -gt 0 ]; do tot=$(($tot+$1)) shift --------> 位置参数左偏移. done echo $tot ----> ./0122.sh 1 2 3 4 5 ----> 输出 15
-
shell函数
1). 函数的定义:
#/bin/bash #deng function add(){ echo 'dengchangtao go go go !!!' } add -------> 在脚本中调用函数.
2). 函数的传参:
#/bin/bash
#dengfunction add(){ num=$1 ----------> 接受传递进来的第一个参数. tot=0 for (( i = 0; i < $num; i++ )); do tot=$(($tot+$i)) done echo $tot } add 10 -----> 调用函数并传参. add 100 add 1000 add 10000
//---------------------------------------------------------- VI编辑器命令大全 ----------------------------------
进入vi的命令
vi filename :------------------ 打开或新建文件,并将光标置于第一行首
vi +n filename :-------------- 打开文件,并将光标置于第n行首
vi + filename :--------------- 打开文件,并将光标置于最后一行首
vi +/pattern filename:-------- 打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :-------------- 在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename…filename :----- 打开多个文件,依次进行编辑
移动光标类命令
h :--------------------------- 光标左移一个字符
l :--------------------------- 光标右移一个字符
space:------------------------ 光标右移一个字符
Backspace:-------------------- 光标左移一个字符
k或Ctrl+p:-------------------- 光标上移一行
j或Ctrl+n :------------------- 光标下移一行
Enter :----------------------- 光标下移一行
w或W :------------------------光标右移一个字至字首
b或B :------------------------光标左移一个字至字首
e或E :------------------------光标右移一个字至字尾
) :------------------------光标移至句尾
( :------------------------光标移至句首
}:------------------------光标移至段落开头
{:------------------------光标移至段落结尾
nG:------------------------光标移至第n行首
n+:------------------------光标下移n行
n-:------------------------光标上移n行
n$:------------------------光标移至第n行尾
H :------------------------光标移至屏幕顶行
M :------------------------光标移至屏幕中间行
L :------------------------光标移至屏幕最后行
0:------------------------(注意是数字零)光标移至当前行首
$:------------------------光标移至当前行尾
屏幕翻滚类命令
Ctrl+u:------------------------向文件首翻半屏
Ctrl+d:------------------------向文件尾翻半屏
Ctrl+f:------------------------向文件尾翻一屏
Ctrl+b;-----------------------向文件首翻一屏
nz:----------------------------将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
插入文本类命令
i :------------------------在光标前
I :------------------------在当前行首
a:------------------------光标后
A:------------------------在当前行尾
o:------------------------在当前行之下新开一行
O:------------------------在当前行之上新开一行
r:------------------------替换当前字符
R:------------------------替换当前字符及其后的字符,直至按ESC键
s:------------------------从当前光标位置处开始,以输入的文本替代指定数目的字符
S:------------------------删除指定数目的行,并以所输入文本代替之
ncw或nCW:------------------------修改指定数目的字
nCC:------------------------修改指定数目的行
删除命令
ndw或ndW:------------------------删除光标处开始及其后的n-1个字
do:------------------------删至行首
d$:------------------------删至行尾
ndd:------------------------删除当前行及其后n-1行
x或X:------------------------删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:------------------------删除输入方式下所输入的文本
搜索及替换命令
/pattern:------------------------从光标开始处向文件尾搜索pattern
?pattern:------------------------从光标开始处向文件首搜索pattern
:set hlsearch ------------------- 将搜索到的内容高亮显示.
:set nohlsearch ----------------- 将搜索到的内容取消高亮显示.
n:------------------------在同一方向重复上一次搜索命令
N:------------------------在反方向上重复上一次搜索命令
:s/p1/p2/g:------------------------将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:------------------------将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:------------------------将文件中所有p1均用p2替换
选项设置
all:------------------------列出所有选项设置情况
term:------------------------设置终端类型
ignorance:------------------------在搜索中忽略大小写
list:------------------------显示制表位(Ctrl+I)和行尾标志($)
number:------------------------显示行号
report:------------------------显示由面向行的命令修改过的数目
terse:------------------------显示简短的警告信息
warn:------------------------在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:------------------------允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan:------------------------禁止vi在搜索到达文件两端时,又从另一端开始
mesg:------------------------允许vi显示其他用户用write写到自己终端上的信息
最后行方式命令
:n1,n2 co n3:------------------------将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:------------------------将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :------------------------将n1行到n2行之间的内容删除
:w :------------------------保存当前文件
:e filename:------------------------打开文件filename进行编辑
:x:------------------------保存当前文件并退出
:q:------------------------退出vi
:q!:------------------------不保存文件并退出vi
:!command:------------------------执行shell命令command
:n1,n2 w!command:------------------------将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:------------------------将命令command的输出结果放到当前行
寄存器操作
"?nyy:------------------------将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw:------------------------将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl:------------------------将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p:------------------------取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:------------------------将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。
******************************************* 常用命令累计 *****************************************
1). ps aux --------------------> 查看所有的进程.
2). ps auxwww ------------------> 查看所有进程的完整信息, 最多加三个w.
3). last -----------------------> 查看服务器的用户登录情况.(可以查看登录的时间, 登录的用户名, 在线的累计时长, 登录的IP)
4). cat 1.log | tee new.log ----> tee 重定向并显示重定向的内容.
5). ls | tr ‘a-z’ ‘A-Z’ --------> tr 替换, 将小写替换为大写.
6). for i in seq 1 10000
; do cat /etc/passwd >> 1.txt ; done ------->
7). du -sh 1.txt ---------------> 查看文件大小, du -sb 1.txt , 参数不同, 显示的单位不同.
8). ls aming* | xargs -i mv {} {}.txt -------------> 给符合条件的文件加上.txt后缀名.
9). cd /opt/ourpalm ; ls -----------> 多个命令可以在一行执行, 中间用;隔开
10). & 符号 --------------------------> 将命令放在后台执行, 如: sleep 100 &
11). -------> 主机之间拷贝文件.
# cd /data // data目录下有我们要拷贝的目标文件目录 test
# tar cvf - test| ssh 10.0.1.11 "cd /copy1/; tar xvf -" //首先将要拷贝的目录test打包,"-" 代表标准输出,然后再ssh 到目标主机 10.0.1.11 ,运行相应的命令。其中tar xvf - 意思是,将前面的标准输出内容作为解包的对象。
总结:其实就是想拷贝的目录先打包,然后将打包好的文件拷贝到目标主机,最后在目标主机上解包。只不过,我们用一条命令实现了边打包边解包的过程。
12). set noai nosi ----------> 取消了自动缩进和智能缩进,这样粘贴就不会错行了。但在有的vim中不行,还是排版错乱。
:set paste ------------> 后来发现了更好用的设置:
进入paste模式以后,可以在插入模式下粘贴内容,不会有任何变形。这个真是灰常好用,情不自禁看了一下帮助,发现它做了这么多事:
•textwidth设置为0
•wrapmargin设置为0
•set noai
•set nosi
•softtabstop设置为0
•revins重置
•ruler重置
•showmatch重置
•formatoptions使用空值
13). seq 命令详解: seq命令用于产生从某个数到另外一个数之间的所有整数。
1. seq [选项]... 尾数 : seq 10 ------------> 默认生成从1 到 10的整数
seq [选项]... 首数 尾数 : seq 5 15 --------> 生成从 5 到 15 之间的整数.
seq [选项]... 首数 增量 尾数 : seq 10 2 20 -------> 以2位步长,生成连续的整数, 12,14,16,18,20.
2. -f选项:指定格式
seq -f"%3g" 9 11 : ---------------> 生成9到11之间整数, %后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。
sed -f"str%03g" 9 11 : --------------> 这样的话数字位数不足部分是0,%前面制定字符串。
3. -w选项:指定输出数字同宽
seq -w 98 101 : -----------------> 098 099 100 101 , 不足位数的在前面补0
14). yes命令: 在命令行中输出指定的字符串,直到yes进程被杀死。不带任何参数输入yes命令默认的字符串就是y.
eg : yes hello ----> 将一直在命令行, 输出hello字样 , 直到ctrl+c终止当前进程.
15). rename oldname newname namelist -----------> 根据名字列表,将老的名字,替换为新的名字, 支持正则表达式.
oldname: 原字符串:将文件名需要替换的字符串;
newname: 目标字符串:将文件名中含有的原字符替换成目标字符串;
namelist: 文件:指定要改变文件名的文件列表。
eg: rename name1.log name.log name1.log ----------> 将name1.log重命名为name.log
正则:
? 可替代单个字符
* 可替代多个字符
eg: rename foo foo0 foo? -------> 会把foo1到foo9的文件重命名为foo01到foo09,重命名的文件只是有4个字符长度名称的文件,
文件名中的foo被替换为foo0。
16). comm命令:(比较的两个文件是排序之后的文件)
comm命令可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集、求差、以及差集操作。
交集:打印出两个文件所共有的行。
求差:打印出指定文件所包含的且不相同的行。
差集:打印出包含在一个文件中,但不包含在其他指定文件中的行。
选项:
-1:不显示在第一个文件出现的内容(删除第一列);
-2:不显示在第二个文件中出现的内容(删除第二列)
-3:不显示同时在两个文件中都出现的内容(删除第三列)
cat a.log ----->22222
33333
44444
aaaaa
ccccc
cat b.log ----->11111
22222
33333
44444
ccccc
ddddd
eg :
1). comm a.log b.log
11111
22222
33333
44444
aaaaa
ccccc
ddddd
第一列 第二列 第三列.
======> 第一列只包含在a.log中出现的行;
第二列包含在b.log中出现的行;
第三列包含在a.log和b.log中相同的行。
各列是以制表符(\t)作为定界符。
2). comm a.log b.log -3 | sed 's/^\t//' -------> 删除第三列, 求两个文件中不相同的行, 两列合并为一列.
3). comm a.log b.log -1 -2 -------------------> 删除第一,第二列, 求两个文件的交集 .
4). 通过删除不需要的列,可以得到a.log和b.log的差集:
17). curl 命令:
①. curl -d "jsonStr={\"common\":{\"interfaceId\":\"0005\",\"pCode\":\"10000538310143000003101430031014300000001\"}}"
"http://pay.0708.com/billingcenter2.0/platform/main.do"
--------> linux命令行模拟post请求
-
Find查找命令的使用:
. 代表当前目录.
1). find . -name “*.txt” ------> 在当前目录下找以.txt结尾的文件.
2). find . -name “[a-z]*” ------> 在当前目录下查找以所有子母开头的文件 , 支持简单的正则
find . -name "file*" -------> 查找以file开头的文件. find . -name "file[1-6]*" -----> 查找file1-file6的文件, 支持简单正则.
3). find /etc -name “host*” -----> 在/etc目录下查找以host开头的文件.
4). find . -perm 755 -----------> 在当前目录下查找权限为755的文件, perm代表的事permission.
5). find -user root -------------> 在当前目录下查找属主为root的文件.
find -user user1 -----------> 查找user1用户创建的文件.
6). find / -perm 755 | find -type f --------> 从根目录查找权限为755的文件, 在查找其中文件类型的文件.
-type : 代表的是指定文件的类型.
7). 也可以简写为: find / -perm 755 -type f ----> 可以直接连着写.
8). find /var -mtime -5 ----------> 在/var下找更改时间在5天以内的文件.
9). find /var -mtime +3 ----------> 在/var下找更改时间在3天以前的文件.
10). find /etc -type d -------------> 在/etc下查找文件类型为d的目录文件.
11). find /etc -type l -------------> 在/etc下查找文件类型为l的链接文件.
12). find . -size +1000000c -------> 在当前目录下查找文件大小大于1M的文件,1M是1000000个字节.
13). find . -perm 700|xargs rm -rf ----> 将管道前面查找的文件, 交给管道后xargs后的命令操作.
xargs ----> 可以将前面的结果提供给后面的命令操作.
14). find . -type f|xargs ls -l ------> 查找出文件并查看详细信息.
-
其他命令:
1). stat /opt/deng --------> 查看目录/文件的状态信息, 信息量如下:
File: `/opt/deng’
Size: 4096 Blocks: 16 IO Block: 4096 directory
Device: 803h/2051d Inode: 530922 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2015-01-26 05:47:35.883617429 -0800 ----> 最后访问时间
Modify: 2015-01-22 06:15:54.564426943 -0800 ----> 最后修改时间
Change: 2015-01-22 06:15:54.564426943 -0800 ----> 最后改变时间2). nl file -------------> 查看file文件, 并显示对应的行号.
3). init -----> linux的启动级别:
init 0 : 关机 init 1 : 单用户形式,只root进行维护 init 2 : 多用户,不能使用net file system init 3 : 完全多用户 , 字符界面 init 4 : 安全模式 , 未被使用 init 5 : 图形化 init 6 : 重启.
4). linux 是多用户系统,多个用户可以同时登陆系统, 而windows是单用户登陆系统,另一用户
要想使用,必须先注销该系统.
5). 可以使用alt + F1-F7 来查看各个linux的终端.
6). ctrl+alt+delete --------> 按住这三个键,linux系统将在3秒内重新启动.
7). ssh 192.168.1.208 ------> 从当前的的linux机器,链接上208这台机器.
8). ssh 192.168.1.208 mkdir /usr/mydir ---------> ssh发送命令到另一台机器, 执行shell指令.
9). ssh-keygen -t rsa -----> 生成ssh的公钥和私钥, rsa是一种加密算法.
10). ssh-copy-id 192.168.1.208 ----> 执行该命令, 将当前机器的公钥拷贝给 208 这台机器.
-----> 也可以给当前的本机执行该命令. 则ssh 本机地址(192.168.1.100)就不需要密码了.
-
grep命令及linux中的正则:
find 用来将文件查找出来, 而 grep是用来检索文件中的内容的.
1). grep ‘linux’ file —> 查找file文件中含有’linux’的行, 只要该行中含有’linux’字样就可以,
不管位置, 但是严格区分大小写
2). grep ‘linux’
find . -name f*
----> 也可以通过命令找到文件, 通过``来解析命令.3). 常用正则表达式:
1. ^linux : 以linux开头的行 2. php$ : 以php结尾的行 3. . : 匹配任意的单个字符 4. .+ : 匹配任意多个字符,不包含0个 5. .* : 匹配0个或者多个字符 6. [0-9a-z]: 匹配[]内任意一个字符 7. (linux)+: 出现多次linux单词 8. (web){2}: web出现了2次以上 (web){2,4}: web出现2-4次 9. \ : 转义字符,只用来屏蔽一个元字符的特殊含义 : * , . , ? 都是有特殊含义的字符. 10. ? : 匹配0个或一个前面的字符. -- grep -E --color 'ro?t' 1.log -----> 匹配'rt', 或'rot' 11. grep -E = egrep
4). grep -c ‘linux’ file ------> -c行数; 返回行数, file文件中包含’linux’有多少行. <结果为总共有几行>
5). grep -n ‘linux’ file ------> -n表示行号; 返回那几行, 带行号的. <返回每一行的行号及内容>
6). grep -i ‘linux’ file ------> -i 表示忽略大小写.
7). grep -v ‘linux’ file -----> 在file文件中过滤linux所在的行, 不包含’linux’的行
-E 表示增强, 个人理解为可以匹配正则, Regex.
8). grep -E “2004:22:5[0-9]” file ----> 在file文件中查找时间在2004:22:50 -> 2004:22:59的所在行.
9). grep -E “[210]” file ----------> 在file文件中查找不包含210的行; ^在[ ]以内的话,表示非的意思.
10). grep -E “h*p” file -------------> 查找file文件中包含h和p的行.
11). grep -E “[5-8][6-9][0-3]” file --> 查找大于560小于893的行.
12). grep -vin ‘linux’ file ----------> -v -i -n 三个参数连着用.
13). grep -E ‘.+linux.+’ file --------> 取出既不以linux开头,也不以linux结尾的,但包含linux的行.
14). grep -E “4{2}” file ------------> 查找包含两个4的行
15). grep -E “4{2,}” file -----------> 查找大于两个4的行
16). grep -E “4{2,4}” file ----------> 查找大于两个4小于4个4的行.
17). grep -E “^$” file ---------------> 查找file文件中的空行
18). grep “?” file ------------------> 查找file文件中包含?的行.
19). grep -E “[p]” file ------------> 查找不是以p开头的file文件中的行.
20). grep -n --color ‘mysql’ 1.txt----> --color 将查询的字符串高亮显示.
21). grep -A5 -n ‘root’ 1.txt --------> 将查找的’root’所在的行, 以及之后的5行也罗列出来.
-A5 : 标示After 5 , 后面的5行也出来了.
22). grep -B5 -n ‘root’ 1.txt --------> 将查找的’root’所在的行, 以及之前的5行也罗列出来.
-B5 :标示Before 5 , 前面的5行也显示出来.
23). grep -r ‘root’ /etc/ ------------> 遍历/etc/下的所有文件,查找’root’ 字符串.
24). grep -n 'rot’ 1.log ------------> o是一个整体, 表示 r与t之间有0个或多个o.
25). egrep -n --color ‘root|mysql’ file.log -----------> 查找出包含’root’或者包含’mysql’的行.
26). grep -n --color ‘root|mysql’ file.log --------> 查找出包含’root’或者包含’mysql’的行.(不能加E)
-
Awk 编程工具使用:
AWK模式:
1). /正则表达式/:使用通配符的扩展集。 2). 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 3). 模式匹配表达式:用运算符~(匹配)和~!(不匹配)。 4). BEGIN语句块、pattern语句块、END语句块:
AWK内置变量:
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项 NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符
AWK操作:
0). cat /etc/passwd |cut -d:-f4 --------> 以:分割文件的行, 并取出passwd文件的第四列.
cat /etc/passwd |cut -d:-f 1,2,3 ----> 取1,2,3列.cat /etc/passwd |cut -c 2,3 --------> 去2,3号位置的字符.
1). awk ‘{print $0}’ file -------------> 查找出file文件中的每一列/整行. linux中的索引是从1开始, $0表示所有的列.
1.1) cat /etc/passwd | head -5 |awk -F: '{print $1,$3}' -----> 以:分割,取出第一列,第三列. 1.2) awk -F ':' {print $2} 1.log ----------> -F 表示以什么分割. 1.3) awk -F ':' '$1~/root/ {OFS="#";print $1,$2}' 1.txt ----------> 以:分割内容, 查找第一列匹配root(包含)的内容,然后输出内容, 并以#分割. 1.4) awk -F ':' '$1=="root" {OFS="#";print $1,$2}' 1.txt ----------> 以:分割内容, 查找第一列精准匹配root(等于)的内容,然后输出内容, 并以#分割. 1.5) awk -F ':' '$1="root" || NR>30 {OFS="#";print $1,$2}' 1.txt ----------> 以:分割内容, 查找第一列等于root或行数大于30的行的指定列的内容,然后输出内容, 并以#分割. 1.6) awk -F ':' '$1="root" {OFS="#";print $1,$2}' 1.txt -----------> 将第一列赋值为root.
2). awk ‘{print $1 “\t” $7}’ file -------> 查找出file文件中的第1列和第7列
3). cat file|awk ‘$0 !~/192.168.10.2/’|grep “php”|wc -l -------> 匹配192.168.10.2的ip地址的统计,!为不匹配.
$0 !~/192.168.10.2/ ----> 表示匹配关系, !~表示不匹配.
4). awk 默认的分隔符就是空格, 所以不需要写-F了
5). df | awk ‘{if(NR==3){print $1}}’ -------> 取出df查看结果的第三行,$1表示第一列.
6). df | awk ‘{if(NR==3){print}}’ -----------> 取出df查看结果的第三行.
7). df | awk ‘{if(NR==3){print $0}}’ --------> 取出df查看结果的第三行,$0表示全部列.
8). df | awk ‘{if(NR==3){print int($4)}}’----> 取出df查看结果的第三行,第四列,并将第四列转为整数.
9). df | awk ‘END{print NR}’ ----------------> 查看df查询结果总共多少行.
10). awk -F ‘/’ ‘{print $NF}’ --------------> 打印最后一列的内容, $(NF-1) —> 打印倒数第二列内容.
==============> {print NR} : 打印出行号.
==============> {print NF} : 打印出每一列被分割出来的个数.11). awk -F ‘:’ ‘{print NR ,NF,$0}END{print FILENAME}’ 3.out ---------> 打印出行号,分割的段数, 末尾行打印出文件名.
12). awk ‘BEGIN{print “begin”} {print $0} END{print “end”}’ 3.out
13). awk ‘NR%2==1{next}{print NR,$0;}’ text.txt -----------> awk中next语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。
14). awk的时间函数:
mktime( YYYY MM dd HH MM ss[ DST]) : 生成时间格式 , 生成的时间都是时间戳 strftime([format [, timestamp]]) : 格式化时间输出,将时间戳转为时间字符串 具体格式,见下表. systime() : 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 %a 星期几的缩写(Sun) %A 星期几的完整写法(Sunday) %b 月名的缩写(Oct) %B 月名的完整写法(October) %c 本地日期和时间 %d 十进制日期 %D 日期 08/20/99 %e 日期,如果只有一位会补上一个空格 %H 用十进制表示24小时格式的小时 %I 用十进制表示12小时格式的小时 %j 从1月1日起一年中的第几天 %m 十进制表示的月份 %M 十进制表示的分钟 %p 12小时表示法(AM/PM) %S 十进制表示的秒 %U 十进制表示的一年中的第几个星期(星期天作为一个星期的开始) %w 十进制表示的星期几(星期天是0) %W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始) %x 重新设置本地日期(08/20/99) %X 重新设置本地时间(12:00:00) %y 两位数字表示的年(99) %Y 当前月份 %Z 时区(PDT) %% 百分号(%)
eg: 1). awk ‘BEGIN{tstamp=mktime(“2015 01 01 12 12 12”);print strftime("%c",tstamp);}’ —> 以本地的日期和时间格式化
------> 结果: 2001年01月01日 星期一 12时12分12秒 2). awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' ------> 结果: 2634468 3). awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}' ------> 结果: 308201392
15). 格式化字符串输出: printf使用.
字符串的格式: 其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出; 另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x/%X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 自动选择合适的表示法 eg: 1). awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%on",n1,n2,n3,n1,n1);}' ------> 结果: 124.11,18446744073709551615,1.2,7C,174
16). 字符串函数:
①. index(str1,str2) -------------> 在str1中查找str2元素所在的位置. eg : awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' ----> "ok" awk 'BEGIN{info="this is a test2010test!";print index(info,"test")}' ----> 11 ②. match(str1,reg1) ------------> 在str1中查找reg1元素所在的位置. eg: awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' ---> "ok" awk 'BEGIN{info="this is a test 2015 , just a test";print match(info,/[0-9]+/)}' ----------> 16 ③. substr(str1,start,length) -----------> 截取字符串, 指定开始索引和长度. eg: awk 'BEGIN{info="thisisatestjustatest";print substr(info,4,10)}' -------> sisatestju ④. length(str) -------------> 求出字符串的长度. ⑤. tolower(str) ------------> 字符串中每个大写字符将更改为小写 ⑥. toupper -----------------> 字符串中的每个小写字符变为大写.
17). awk中的数组:
数组的定义: ①. 以数字为下表: Array[1]="sun" Array[2]="kai" ②. 以字符串做下表: Array["first"]="www" Array["last"]="name" Array["birth"]="1987" 读取数组中的值: { for(item in array) {print array[item]}; } #输出的顺序是随机的 { for(i=1;i<=len;i++) {print array[i]}; } #Len是数组的长度
-
Sed 行定位的使用:
1). sed -n '2’p file ------------> 只打印第二行,不打印其他的行.
p---> 表示打印print.
2). sed -n '1,4’p file -----------> 从第一行到第四行的记录.
3). sed '1,4’d file --------------> 除了第一行到第四行的记录.
d---> 表示临时删除delete,不显示.
4). cat file | sed -n '1,4’p ----->
5). cat file | sed -n '/linux/'p -----> 查询file文件中含有linux的行.
6). cat file | sed -n '1,/Linux/'p -----> 查询file文件中从第一行开始到含有Linux的行的所有行.
7). cat file | sed -n '/Linux/,'p ------> 查询file文件中的行,从含有Linux的行至文件的结束.
cat file | sed -n -r '/root|mysql/p' ------> 查找root或者mysql. -r 可以转移特殊符号, 如 * , ? , |
8). cat file | sed -n '/Linux/,'p > file2 ------> 查询file文件中的行,从含有Linux的行至文件的结束, 并将结果重定向到file2文件中.
9). 删除 – d :
a. sed '2'd example-----删除example文件的第二行。 b. sed '2,$'d example-----删除example文件的第二行到末尾所有行。 c. sed '$'d example-----删除example文件的最后一行。 d. sed '/test/'d example-----删除example文件所有包含test的行。
10).替换 – s :
a. sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,g表示全局,则只有每行第一个匹配的test被替换成mytest。 b. sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。 也就是说,如果某一行开头的test被替换成mytest,就打印它。 c. sed 's/^192.168.0.1/&localhost/' example----- &符号表示替换字符串中被找到的部份。 所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。 d. sed -n 's/loveable/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。 e. sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。 表示把所有10替换成100。
11). 选定行的范围:逗号-- ,
a. sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。 b. sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。 c. sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
12).多点编辑:e命令
a. sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。 命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。 b. sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
13). 从文件读入:r命令
a. sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
14). 写入文件:w命令
a. sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。
15). 追加命令:a命令
a. sed '/^test/a\\--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
16). 插入:i命令
a. sed '/test/i\\ new line -------------------------' example 如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
17). 下一个:n命令
a. sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
18).变形:y命令
b. sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
19). 退出:q命令
a. sed '10q' example-----打印完第10行后,退出sed。
20). 保持和获取:h命令和G命令
a. sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
21). 保持和互换:h命令和x命令
a. sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
21). 脚本
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
-
uniq行定位的使用:
1). uniq -c file ------------------> 打印紧挨的重复行出现的次数 , 去重求唯一.
uniq file ------------------> 去除紧挨的重复的行.
2). uniq -d file -------------------> 只打印重复的行;
3). awk ‘{print $1}’ /var/log/httpd/access_log | sort | uniq -c
--------> 把apache网站的所有访问的ip全部统计出来, 并打印出统计次数.
-
sort排序:
1). sort file ------------> 把文件按字母的升序进行排序 , 数字在前,字母在后.
2). sort -r file -----------> 把文件按字母的降序进行排序. r: reverse
3). cat file | sort -t:-k1 -r ------> 为:进行分割后的第一列来倒序排序
-t -----> 表示以什么来分割. -k1 ----> 表示取分割后的第几列 -r -----> 表示反转 -n -----> 表示按照数字排序 , 否则按照ASCII排序 --------> 空格是默认的分割符, 可以不写-t
4). sort -t ‘:’ -k3 -n /etc/passwd | cut -d ‘:’ -f 3 ---------> 将/etc/passwd 中的内容按’:'切分,取第三列, 按照数据排序, 在获取第三列的内容.
5). cat 1.lo 2.lo | sort -nr | uniq -c | sort -nr
-
split 文件切割的使用:
1). split -2 file spt ----------------> 生成sptab , sptac … sptaa 等多个文件.
把file文件每两行分割成一个文件,每个文件的前缀都是以spt开头的. -2 ----> 表示分割的单位,每两行成一个文件. spt----> 是分割后文件名的前缀.
2). split -b 1M file ----------------> 将file文件进行切割, 每个文件为1M.
-
Linux的启动流程和脚本服务:
******** 初始化阶段 ***********
1). bios找到磁盘上的mbr主引导扇区.2). 进入grub界面选择相应的启动内核
3). 读取kernel内核文件 -/boot/vmlinuz-*
4). 读取init的镜像文件 -/boot/initrd-*
5). init去读取/etc/inittab
6). 读取启动级别 (id:3:initdefault)
7). 读取/etc/rc.d/rc.sysinit,完成时钟设置, 主机名的设置,分区表的挂载/etc/fstab
8). 读取/etc/rc.d/rc 脚本, 通过该脚本吸收3级别, 然后启动/etc/rc.d/rc3.d下所有
以s开头的服务, 不启动该目录下的以k开头的服务
9). 读取/etc/rc.d/rc.local脚本
10). 设置防火墙.
11). 检测硬件变化.
12). 启动网络服务
13). 启动init默认级别下允许启动的进程(如sshd).
14). 进入登录界面.
------------- 知识点 -----------
1). 可以修改/etc/inittab文件的id:3:initdefault, 可以修改init的级别, 5 是含有图形化界面, 3没有图形化界面.2). chkconfig --level 3 sshd off ----> 设置初始化级别下sshd服务的开启情况为off . 调配服务是否启动.
3). chkconfig --list sshd -----------> 查看各个级别下的sshd服务的初始化开启情况.
-
自定义服务脚本及制作rpm服务脚本:
1). 脚本程序: 0204.sh
#/bin/bash #deng # chkconfig: 2345 90 10 # description: mytest script 0204.sh runing/stoping............ case $1 in start ) echo "system starting......................" sleep 2 ;; stop) echo "system stoping......................" sleep 2 ;; restart ) echo "system restarting......................" sleep 2 ;; *) echo "please input start|stop|restart......................" sleep 2 ;; esac
2). 想让该0204.sh脚本随linux启动,可以将该脚本在 /etc/rc.d/rc.local中启动该脚本.
3). 只要脚本在/etc/rc.d/init.d 下,service就可以管理, 就可以使用 service 0204.sh start , 执行脚本 , 并传递位置变量.
service 命令在任何位置都会启动该脚本, 因为脚本放在了init.d下.
4). 特别注意服务脚本中的信息:
解析: # chkconfig: 2345 90 10 ----------> 2345 代表这四种初始化级别. ----------> 90 代表linux启动的优先级,尽量靠后, ----------> 10 代表linux关闭时,停止进程的顺序, 尽量靠前. # description: mytest script 0204.sh runing/stoping............ -----------> 描述信息.
5). 如果需要自定义服务脚本, 需要加上 上面两句代码 . 并将脚本放在 /etc/rc.d/init.d 目录下.
-
制作字符菜单:
1). 添加用户
2). 设置密码
3). 删除用户
4). 查看磁盘空间
5). 查看内存空间
6). 退出
7). 返回主菜单--------------- menu.sh ---------------- 主要负责菜单界面的显示
#!/bin/bash
#dengfunction menu(){ -------> 将其封装成为函数.
title=“My menu”
url=“www.itcast.com”
time=date +%Y-%m-%d
cat << eof ----------------> 利用cat多行输出文件
############################################
echo -e "\033[32;40m$title\033[0m"
############################################-
- add a user
-
- set password for user
-
- delete a user
-
- print disk space
-
- print mem space
-
- quit
-
- back to main menu
############################################
$url $time
############################################
eof ----------------------> 结束标示符 , 必须顶格对其, 而且后面没有空格及其他字符.
}
- back to main menu
---------------------- index.sh ----------------- 菜单的功能脚本------------
#!/bin/bash
#deng. menu.sh -----> 表示引入文件 menu.sh
clear -----> 清空当前的界面显示的内容
menu -----> 调用menu函数while true
do
read -p "please input a option : " optioncase $option in 1 ) read -p "please input your add username : " username useradd $username &>/etc/null if [[ $? = 0 ]]; then echo -e "\033[32;40m${username} created usccessfully!!!\033[0m" else echo -e "\033[31;40m${username} created failly!!!\033[0m" fi ;; 2 ) read -p "please input your set password username : " name # passwd $name read -p "please input your new password : " pass echo $pass | passwd --stdin $name &>/etc/null if [[ $? = 0 ]]; then echo -e "\033[32;40m ${name} password setted successfully!!!\033[0m" else echo -e "\033[31;40m${name} password setted failly !!!!\033[0m" fi ;; 3 ) read -p "please input your delete username : " user userdel $user &>/etc/null if [[ $? = 0 ]]; then echo -e "\033[32;40m ${user} delete successfully!!!\033[0m" else echo -e "\033[31;40m${user} delete failly !!!!\033[0m" fi ;; 4 ) disk=`df -Th` echo -e "\033[30;47m$disk\033[0m" ;; 5 ) str=`free -m` echo -e "\033[30;47m$str\033[0m" ;; 6 ) read -p "are you sure to quit ?(y/n) :" response case $response in y) echo -e "\033[32;40mQuit successfully!!!!\033[0m" break ;; *) continue ;; esac ;; 7) clear menu ;; esac
done
-
12 . 制作字符菜单详情解析:
1). shell函数的定义:
function menu(){
......
}
2). shell函数的调用:
直接在脚本中写函数名就可以.
menu
3). cat命令的heredoc的使用:
a. cat file ----> 查看文件.
b. cat << eof
.....
.....
eof
-----> 保证其中的内容保持原格式输出.
-----> 其中也可以引用变量.
-----> 其中也可以执行命令 `` ;
4). 字符界面下的字符的颜色的控制:
echo -e "\033[31;40m .... \033[0m"
5). shell引入文件.
. file.sh ----> 在当前脚本中包含file.sh文件.
menu ----------> 并执行file.sh中的menu函数.
6). while 写一个死循环:
while true
do
......
done
-
shell操作mysql数据库
1). /usr/local/mysql/bin/mysql -uroot -p2143" -e “show databases”
--------> -e 后面直接跟sql语句, 必须使用双引号.
2). shell脚本中使用mysql数据库:
#!/bin/bash #mysql.sh mysql="/usr/local/mysql/bin/mysql -uroot -92143" sql="create table deng.user( -- 指定使用哪个库 id int unsigned auto_increment primary key, username varchar(50), password varchar(50) )" $mysql -e "$sql"
----------> 使用shell脚本创建一张表.
3). 采用shell中位置参数, 来传递参数, 操作mysql数据库
#!/bin/bash #mysql.sh #deng connection="mysql -uroot -p2143" case $1 in select ) sql="select * from deng.user" ;; delete) sql="delete from deng.user where id=$2" ;; update) sql="update deng.user set username=$3 where id=$2" ;; insert) sql="insert into deng.user(id,username,password) values($2,$3,$4)" ;; esac $connection -e "$sql"
-
日志切割
-
date +%Y%m%d ---------> 20150406
-
date -d yesterday +%Y%m%d -------> 返回昨天的时间(20150405)
-
日志分割: – logcut.sh
#!/bin/bash
#deng
#logcut.shyesterday=
date -d yesterday +%Y%m%d
srclog="/usr/local/apache2/logs/access_log"
dstlog="/usr/local/apache2/logsbak/access_${yesterday}.log"
mv $srclog $dstlog – 重命名
pkill -1 httpd – 重构刷新apache , 并不是重启.
-
将脚本加入到任务计划中:
crontab -l -----> 查看任务计划.vi crontab ------> 编辑任务计划. 时间 : 分时日月周
-
分割日志, 记录插入数据库
#!/bin/bash
#deng
#logcut.shyesterday=
date -d yesterday +%Y%m%d
srclog="/usr/local/apache2/logs/access_log"
dstlog="/usr/local/apache2/logsbak/access_${yesterday}.log"
mv $srclog $dstlog
pkill -1 httpd
tempfile=$$.txt --生成临时文件,名称随机 如7781.txt
cat $dstlog | awk ‘{print $1}’ | sort|uniq -c | awk '{print $2":"KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲'>tempfile
mysql="/usr/local/mysql/bin/mysql -uroot -p2143"
for i in
cat $tempfile
; do
ip=cat $i | awk -F: '{print $1}'
num=cat $i|awk -F: '{print $2}'
sql="insert into test.countab(date,ip,num) values('$yesterday','$ip','$num')" $mysql -e $sql
done
rm -rf $tempfile
sql=“select * from test.countab”
$mysql -e $sql -
date -s “2014/12/17” -----> 修改系统时间
-
tree deng/ —> 查看目录的树状结构.
-
-
常用命令积累:
1). dirname -------> 获取文件的目录部分, 如: dirname ./compare.log --> .
dirname /usr/compare.log --> /usr
2). basename ------> 获取文件的文件名. 如: dirname ./compare.log --> compare.log
dirname /usr/compare.log --> compare.log
3). jobs ----------> 查看暂停的命令 , 显示的结果中可以看出优先级 (+)
4). fg id号 -------> 可以继续执行任务, 如果不指定ID号, 将执行优先级高的id号.
5). ctrl + z ------> 暂停执行命令.
6). 系统变量(均为大写): HOME PATH LANG HOSTNAME
7). env ----------> 可以查看系统内置的变量
8). set -----------> 可以查看系统和用户设置的所有的变量.
9). export --------> 将变量声明为全局生效, 如果不这样, 只是在当前的shell中生效.
10). . = source —> 刷新当前配置文件, 注意 . 后面是有一个空格的.
11). /etc/profile /etc/bashrc