Linux命令(全)

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授权.配置中配置.

  1. 设置

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

  1. 使用无密码的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 脚本编程 ------------------------------

  1. 历史命令

    history 查看历史命令;

     ! 指定的命令索引, 可以调用该命令   !5 --> 执行第五条命令
     
     !vi --> 调用历史中最后一次使用vi开头的命令.  !ser --> 执行历史中最后一次执行的ser*开头的命令
    

    history -c 清除历史命令

    init 0 关闭系统

    tr —> 转换字符, 如: 将大写转为小写,选项可以让你指定所要删除的字符,以及将一串重复出现的字符浓缩成一个.

  2. 命令别名

    alias x=‘ll’ —> 给命令起别名, 然后可以使用简短的别名操作

     ---> 这样的别名, 服务器重新启动后就会失效 ; 持久化, 可以将其存储在 .bashrc文件中
    

    alias —> 查看系统中的所有的命令的别名.

    unalias x —> 清除指定的别名.

  3. 输出重定向

    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中, 而且还是追加.

    < 输入数据.

  4. 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"表示换行 , 查找指定的列.

  5. 执行shell脚本的方式:

    1). bash test.sh -----> 不需要再文件中写解析器
    -----> 不需要给脚本设置执行权限

    2). ./test.sh -----> 需要些解析器
    -----> 需要给脚本设置执行权限.

  6. crontab LINUX下的任务调度:

    格式: * * * * * *
    分 时 日 月 周 命令

    30 21 * * * /usr/local/etc/rc.d/lighttpd restart
    ----> 上面的例子表示每晚的21:30重启apache

    30 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. 变量的定义: 变量的引用 $

    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">{}将变量封装在{}中引用输出.

  2. read -p ---------> 接受键盘输入事件 : /*** read [-p “信息”] 变量名

    $name ----> 表示变量name, $ 引用变量.

    read -p “please input your name :” name -----> 读取键盘事件接受到的内容, 将其赋值给变量name

    echo “my name is $name”

  3. name=“dengchangtao”

    echo $name

    echo ‘my name is $name’ —> my name is $name —>

  4. 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.

  5. date ----> linux 命令可以直接输出当前的日期时间.

    set -x -----> 打开shell脚本的执行跟踪功能;

    set +x -----> 关闭shell脚本的执行跟踪功能.

  6. unset 变量名 —> 清除变量.

    name=“dengchangtao”
    echo $name —> dengchangtao
    unset name
    echo $name —> 没有输出内容

  7. 位置变量:

    $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 $3

    sh test.sh 11 22 33 —> 一次输出11 , 22 , 33

  8. 位置变量的使用案例; --> case in esac 语句的使用. 注意语法格式.

case $1 in
start)
echo “this is starting…”
;;
stop)
echo “this is stoping…”
;;
esac

  1. linux 中是不支持 echo 1+2 这种直接运算操作的, 会原样输出

    echo $(( $1+$2 )) —> 这种语法可以解析. 输出变量1和变量2 之和.

    expr 10 + 20 —> 可以解析运算符. 注意 "+"的左右是有空格的, 否则会报错.

    expr 10 - 20 ,expr 10 \ 20,expr 10 * 20,expr 10 % 20 ----> * 是特殊字符, 需要转义.

  2. 预定义变量:

    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的输入, 输出 -------

  1. echo -e “my name is user1\nmy name is user2”; ---------------> \n 表示换行.

  2. 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 白色

/-------------- 文件测试 和 整形测试 --------------

  1. 测试文件的状态:

    格式: [ 操作符 文件或目录 ] ---------> 执行结果为真,则返回0, 如果为假, 则返回非0 ;

  2. 常用的测试操作符

    1). -d: 测试是否为目录(Disctory) ;
    2). -e: 测试目录或文件是否存在(Exist);
    3). -f: 测试是否为文件(File);
    4). -r: 测试当前用户是否具有权限读取(Read);
    5). -w: 测试当前用户是否具有权限写入(Write);
    6). -x: 测试当前用户是否可以执行(Excute);
    7). -L: 测试是否为符号链接(Link)文件;

  3. 条件测试在shell脚本中的使用:

    #!/bin/bash
    #deng

    if [ -f ./file1 ]
    then
    echo “file1 is exists”
    else
    echo “file1 is not exists”
    touch file1
    fi

    ----> 判断文件file1是否存在,如果存在则输出 “file1 is exists”, 如果不存在,则输出"file1 is not exists" ,并创建文件.

  4. 挂载和未挂载:

    mount —> 挂载

     mount /dev/cdrom/media ----> 挂载光盘
    
     在挂载光盘时,会输出许多挂载光盘是的日志信息, 可以屏蔽掉
    
     mount /dev/cdrom/media &> /dev/null -----> 屏蔽掉信息,也就是将其输出重定向到null这个黑洞中.
    

    unmount ----> 未挂载.

     unmount  /dev/cdrom/media ----> 未挂载光盘
    
  5. 整型数据的比较:

    格式: [ 整数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
    #deng

     bootspace=`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 ----> 退出邮件系统.

  6. 字符串测试和逻辑测试:

    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 或 ||	逻辑或,'或者'的意思
     	③. !:		逻辑否, 当指定的条件不成立时, 返回的结果为真.
    
  7. 流程控制.

    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. 
    
  8. 循环控制.

    1). while … do … done 循环

     **** 注意 while条件判断后面是有个空格的.
    

    eg1:
    #/bin/bash
    #deng

     num=10
     //注意while后面的空格.
     while [ $num -gt 0 ]  -------------> 符合条件执行do之后的代码. 执行完毕之后,执行done的代码.
     do
     	echo $num
     	num=$(($num-1))
     done
     	echo '最后一个num是'$num
    

    eg2:
    //求连续数字的和.
    num=100
    tot=0

     while [ $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 ilt5]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))
    done

    2). 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
    
  9. 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
    #deng

     tot=0
     while [ $# -gt 0 ]; do
     	tot=$(($tot+$1))
     	shift             --------> 位置参数左偏移.
     done
     	echo $tot
    
     ----> ./0122.sh 1 2 3 4 5 ----> 输出   15
    
  10. shell函数

    1). 函数的定义:

    #/bin/bash
    #deng
    function add(){
    	echo 'dengchangtao go go go !!!'
    }
    
    add   -------> 在脚本中调用函数.
    

    2). 函数的传参:
    #/bin/bash
    #deng

    function 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请求  
  1. 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 ------> 查找出文件并查看详细信息.

  2. 其他命令:

    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)就不需要密码了.
    
  3. 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)

  4. 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是数组的长度
    
  5. 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对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。 
    
  6. 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全部统计出来, 并打印出统计次数.
    
  7. 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

  8. split 文件切割的使用:

    1). split -2 file spt ----------------> 生成sptab , sptac … sptaa 等多个文件.

     		把file文件每两行分割成一个文件,每个文件的前缀都是以spt开头的.
     
     -2 ----> 表示分割的单位,每两行成一个文件.
    
     spt----> 是分割后文件名的前缀.
    

    2). split -b 1M file ----------------> 将file文件进行切割, 每个文件为1M.

  9. 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服务的初始化开启情况.

  10. 自定义服务脚本及制作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 目录下.

  11. 制作字符菜单:

    1). 添加用户
    2). 设置密码
    3). 删除用户
    4). 查看磁盘空间
    5). 查看内存空间
    6). 退出
    7). 返回主菜单

    --------------- menu.sh ---------------- 主要负责菜单界面的显示
    #!/bin/bash
    #deng

    function menu(){ -------> 将其封装成为函数.
    title=“My menu”
    url=“www.itcast.com”
    time=date +%Y-%m-%d

    cat << eof ----------------> 利用cat多行输出文件
    ############################################
    echo -e "\033[32;40m$title\033[0m"
    ############################################

      1. add a user
      1. set password for user
      1. delete a user
      1. print disk space
      1. print mem space
      1. quit
      1. back to main menu
        ############################################
        $url $time
        ############################################
        eof ----------------------> 结束标示符 , 必须顶格对其, 而且后面没有空格及其他字符.
        }

    ---------------------- index.sh ----------------- 菜单的功能脚本------------
    #!/bin/bash
    #deng

    . menu.sh -----> 表示引入文件 menu.sh

    clear -----> 清空当前的界面显示的内容
    menu -----> 调用menu函数

    while true
    do
    read -p "please input a option : " option

    case $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
  1. 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"
    
  2. 日志切割

    1. date +%Y%m%d ---------> 20150406

    2. date -d yesterday +%Y%m%d -------> 返回昨天的时间(20150405)

    3. 日志分割: – logcut.sh

      #!/bin/bash
      #deng
      #logcut.sh

      yesterday=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 , 并不是重启.

    4. 将脚本加入到任务计划中:
      crontab -l -----> 查看任务计划.

      vi crontab ------> 编辑任务计划. 时间 : 分时日月周

    5. 分割日志, 记录插入数据库

      #!/bin/bash
      #deng
      #logcut.sh

      yesterday=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

    6. date -s “2014/12/17” -----> 修改系统时间

    7. tree deng/ —> 查看目录的树状结构.

  3. 常用命令积累:

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值