命令(20个)
echo,printf,rpm,yum,watch,alias,unalias,clear,history,eject,time,nc,xargs,exec,export,unset,type,bc,tee,read
13.1.xargs
功能:从标准输入来执行命令
常用选项:
-a file 从指定文件读取数据作为标准输入
-0 处理包含空格的文件名,print0
-d delimiter 分隔符,默认是空格分隔显示
-i 标准输入的结果以{}代替
-I 标准输入的结果以指定的名字代替
-t 显示执行命令
-p 交互式提示是否执行命令
-n 最大命令行参数
--show-limits 查看系统命令行长度限制
示例:
上面find的例子已经很多了
介绍两个常用的:
[root@localhost scripts]# cat number.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[root@localhost scripts]# cat number.txt |xargs -n1 #列变行,-n1就是最大1列打印
1
2
3
4
5
6
7
8
[root@localhost scripts]# cat number.txt |xargs -n2 #这里就是最大两列打印
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
[root@localhost scripts]# cat number.txt |xargs -n3 #3列显示
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20
13.2.exec
exec命令 |
作用 |
exec ls |
在shell中执行ls,ls结束后不返回原来的shell中了 |
exec |
将file中的内容作为exec的标准输入 |
exec >file |
将file中的内容作为标准写出 |
exec 3 |
将file读入到fd3中 |
sort <&3 |
fd3中读入的内容被分类 |
exec 4>file |
将写入fd4中的内容写入file中 |
ls >&4 |
Ls将不会有显示,直接写入fd4中了,即上面的file中 |
exec 5<&4 |
创建fd4的拷贝fd5 |
exec 3<&- |
关闭fd3 |
exec 执行程序
虽然exec和source都是在父进程中直接执行,但exec这个与source有很大的区别,source是执行shell脚本,而且执行后会返回以前的shell。而exec的执行不会返回以前的shell了,而是直接把以前登陆shell作为一个程序看待,在其上经行复制。
举例说明:
root@localhost:~/test#exec ls
exp1 exp5 linux-2.6.27.54 ngis_post.sh test xen-3.0.1-install
[root@localhost ~]# exec >text
[root@localhost ~]# ls
[root@localhost ~]# pwd
[root@localhost ~]# echo "hello"
[root@localhost ~]# exec >/dev/tty
[root@localhost ~]# cat text
anaconda-ks.cfg
install.log
install.log.syslog
test
text
/root
hello
exec >text 是将当前shell的标准输出都打开到text文件中
root@localhost:~/test#cat test
ls
Pwd
root@localhost:~/test#bash
root@localhost:~/test#exec root@localhost:~/test#lsexp1 exp5 linux-2.6.27.54 ngis_post.sh test text xen-3.0.1-installroot@localhost:~/test#pwd/root/testroot@localhost:~/test#root@localhost:~/test#exit #自动执行
exec的重定向
先上我们进如/dev/fd/目录下看一下:
[root@localhost ~]# cd /dev/fd
[root@localhost fd]# ls
0 1 2 255
在shell脚本中使用exec命令,根据操作的对象不同会有不同的行为
默认会有这四个项:
0是标准输入,默认是键盘。
1是标准输出,默认是屏幕/dev/tty
2是标准错误,默认也是屏幕
其他 3-9 都是空白描述符
当我们执行exec 3>test时:[root@localhost fd]# exec 3>/root/test[root@localhost fd]# ls0 1 2 255 3多了个3,也就是又增加了一个设备,这里也可以体会下linux设备即文件的理念。这时候fd3就相当于一个管道了,重定向到fd3中的文件会被写在test中。关闭这个重定向可以用exec 3>&-。[root@localhost fd]# who >&3[root@localhost fd]# ls >&3[root@localhost fd]# exec 3>&-[root@localhost fd]# cat /root/testroot tty1 2017-06-04 10:28root pts/0 2017-06-04 21:42 (192.168.6.8)root pts/1 2017-06-04 21:51 (192.168.6.8)root pts/2 2017-08-30 23:37 (192.168.6.8)root pts/3 2017-08-30 23:55 (192.168.6.8)0122553应用举例:[root@localhost scripts]# cat ex.sh#!/bin/bashexec 3while read -u 3 pkg;doecho "$pkg"done[root@localhost scripts]# sh ex.shroot tty1 2017-06-04 10:28root pts/0 2017-06-04 21:42 (192.168.6.8)root pts/1 2017-06-04 21:51 (192.168.6.8)root pts/2 2017-08-30 23:37 (192.168.6.8)root pts/3 2017-08-30 23:55 (192.168.6.8)0122553exec 3>&1 4>&2 1>> zhis_bash.log 2>&1其含义是 复制标准输出到3 错误输出到 4 把 3 4 保存在zhis_bash.log 这个文件中等同于 再写一个shell 类似[sql] view plain copycat another shell./zhis_bash.sh >>zhis_bash.log 2>&1如果exec 跟的是其他命令,则其他命令结束后,本shell也随之停止[root@localhost ~]# cat test_exec.sh#!/bin/bashecho "hello mysql"exec echo " hello oracle"echo "hello db2"运行一下[root@localhost ~]# ./test_exec.shhello mysqlhello oracle可以看到随着 echo " hello oracle" 这条指令运行完本 整个脚本执行完毕。后面的 echo " hello db2" 没有执行
13.3.echo
功能:打印一行
语法:
echo [SHORT-OPTION]... [STRING]...
echo LONG-OPTION
常用选项:
-n:不输出换行符
-e:解释转义字符
-E:不解释
示例:
[root@localhost ~]# echo -e '1\n2\n3' #加了-e,就把\n定义为换行字符,这样才会换行打印123[root@localhost ~]# echo '1\n2\n3' #不加就只是作为字符输出了1\n2\n3[root@localhost ~]# echo -e '1\t2\t3' #解释制表符1 2 3[root@localhost ~]# echo '1\t2\t3'1\t2\t3[root@localhost ~]# echo hello,world > 1 #echo的重定向功能[root@localhost ~]# cat 1hello,world[root@localhost ~]# echo welcome to linux world >> 1 #echo的追加功能[root@localhost ~]# cat 1hello,worldwelcome to linux world
13.4.printf
功能:格式化打印数据,默认打印字符串不换行
语法:printf FORMAT [ARGUMENT]...
printf OPTION
常用选项:
format:
%.ns 输出字符串,n是输出几个字符
%ni 输出整数,n是输出几个数字
%m.nf 输出浮点数,m是输出的整数位数,n是输出的小数位数
%x 不带正负号的十六进制值,使用a至f表示10至15
%X 不带正负号的十六进制,使用A至F表示10至15
%% 输出单个%
%d 有符号32位整数
%lld 有符号64位整数
%llx 有符号64位16进制整数
%u 无符号32位整数
常用空白符:
\n:换行
\r:回车
\t:水平制表符
对齐方式:
%-5s 对参数每个字段左对齐,宽度为5
%-4.2f 左对齐,宽度为4,保留两位小数
不加横线"-"表示右对齐。
示例:
#打印一个字符:[root@localhost test]# printf "%.1s" 123#打印三个字符:1[root@localhost test]# printf "%.3s" 123#不保留小数,前面什么都不加123[root@localhost test]# printf "%.f" 1.314529#保留两位1[root@localhost test]# printf "%.2f" 1.314529#换行打印,看到前面的为啥没有结果,因为都跑到第二行开头来了1.31[root@localhost test]# printf "%.2f\n" 1.3145291.31#格式化打印:[root@localhost test]# printf "user: %s\tpassword: %d\n" root 123user: root password: 123#左对齐宽度5[root@localhost test]# printf "%-5s %-5s %-5s\n" 1 2 31 2 3#右对齐宽度5[root@localhost test]# printf "%5s %5s %5s\n" 1 2 31 2 3#每行右对齐[root@localhost test]# printf "%5s\n" 1 2 3123#每行左对齐[root@localhost test]# printf "%-5s\n" 1 2 3123
13.5.rpm
功能:rpm软件包管理器
常用选项:
-ivh 安装软件包
-Uvh 升级软件包,如果原来软件包不存在则安装
-Fvh 升级软件包,如果原来的软件包不存在则停止升级
-e 卸载软件包
--nodeps 忽略依赖关系
注意:
安装时,尽量不要忽略依赖关系;卸载时可以忽略依赖关系
-f 强制安装
-q 查看软件包是否安装上
-qa 查看所有的安装的rpm包
-qa |grep xxx
-ql 查看软件所带来的软件列表
-qc 查看软件所带来的配置文件
-qd 查看软件所带来的帮助文档
-qf filename 查看文件来自于哪个软件包
rpm --import PUBKEY .. 导入软件包的数字签名认证
--test 测试
--initdb 初始化rpm数据库
--rebuilddb 重建rpm数据库 在rpm和yum无响应的情况使用 先 rm -f /var/lib/rpm/__db.00* 在重建
示例:
1)rpm包管理:# rpm -ivh zsh-4.3.10-5.el6.x86_64.rpmwarning: zsh-4.3.10-5.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEYPreparing... ########################################### [100%]1:zsh ########################################### [100%]--这是成功安装# rpm -ivh zsh-4.3.10-5.el6.x86_64.rpmwarning: zsh-4.3.10-5.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEYPreparing... ########################################### [100%]package zsh-4.3.10-5.el6.x86_64 is already installed--这是已经安装过了关于上面的警告信息,其实就是在说操作系统没有这个软件包相关的签名信息;你用rpm命令来安装,有没有此警告无所谓。但如果你用yum来安装,yum里一个参数为gpgcheck=0的话,则表示没签名没问题,gpgcheck=1的话,则没签名就安装不了。解决这问题:# rpm --import RPM-GPG-KEY-redhat-release2)依赖性的问题:# rpm -ivh mysql-5.1.61-4.el6.x86_64.rpmerror: Failed dependencies:libmysqlclient.so.16()(64bit) is needed by mysql-5.1.61-4.el6.x86_64libmysqlclient.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.61-4.el6.x86_64libmysqlclient_r.so.16()(64bit) is needed by mysql-5.1.61-4.el6.x86_64libmysqlclient_r.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.61-4.el6.x86_64mysql-libs = 5.1.61-4.el6 is needed by mysql-5.1.61-4.el6.x86_64--这些依赖性怎么解决,如果你安装的是rhel的iso里的包,那么它的依赖包也一定在iso里(如果你是安装一个第三方的包,那么依赖性就不能保证全在iso里)解决的过程很艰辛,具体查找的过程就不写了,下面这是安装顺序,并且最后一句比较特殊,它是A依赖B,B又同时依赖A,要两个一起安装的一个典型例子# rpm -ivh mysql-libs-5.1.61-4.el6.x86_64.rpm# rpm -ivh keyutils-libs-devel-1.4-4.el6.x86_64.rpm# rpm -ivh libcom_err-devel-1.41.12-12.el6.x86_64.rpm# rpm -ivh libsepol-devel-2.0.41-4.el6.x86_64.rpm# rpm -ivh libselinux-devel-2.0.94-5.3.el6.x86_64.rpm# rpm -ivh krb5-devel-1.9-33.el6.x86_64.rpm# rpm -ivh openssl-devel-1.0.0-20.el6_2.5.x86_64.rpm# rpm -ivh mysql-devel-5.1.61-4.el6.x86_64.rpm mysql-5.1.61-4.el6.x86_64.rpm3)冲突:报错里有conflict关键字的时候,就是冲突了,解决方法:一般来说要先干掉冲突的包,再安装新包但是也有特殊情况,比如我已经安装了A包,然后安装B包时,报两个包的其中一个文件冲突,怎么解决?方法一:把这个文件mv走,然后安装方法二: rpm -ivh --force xxxx.rpm 强制安装,那么这个冲突的文件会被覆盖方法三: rpm -ivh --nodocs xxxx.rpm 这个nodocs的参数表示不安装它的文档文件(如果你冲突的文件是一个文档的话。如果不是文档文件,则要用其它相关参数rpm -ivh --nodeps 脱离依赖性 但是包不一定能用,因为你少了一些依赖包的功能rpm -ivh --nomd5 不检验md5值rpm -ivh --noscripts 不想启用或者自动执行某些命令rpm -ivh --replacefiles 某个文件已经安装在系统上,或者冲突,可以用此参数覆盖 注意:此操作无法复原rpm -ivh --replacepkgs 重新安装某个已经安装过的包,比如说一个包你修改过,但不知道改在哪里,可以这样重新安装rpm -ivh --force 相当是强制安装,是--replacefiles和--replacepkgsrpm -ivh --test 测试是否能安装到此linux系统中rpm -qa --查看你系统上已经安装的rpm包(注意,只限于rpm包)# rpm -qa |grep mysqlrpm -ql# rpm -ql mysql-5.1.61-4.el6.x86_64 --查看一个软件包都安装了哪些文件,从这里也可以了解到linux安装软件是把文件按功能分散到各个目录,后面的包名不用写全# rpm -qpl rpm -qpl mysql-5.1.61-4.el6.x86_64.rpm --如果你一个软件包还没有安装,但你要查看一下安装会产生哪些文件分布,可以加个p参数,但后面的包名要写全rpm -qi mysql-5.1.61-4.el6.x86_64 --查看软件包有关信息和说明# rpm -qf `which mount` --查看一个文件属于哪个软件包util-linux-ng-2.17.2-12.7.el6.x86_64# rpm -e mysql-5.1.61-4.el6.x86_64 --删除一个rpm包的安装,但是删除也有依赖性.
13.6.yum
功能:rpm软件包在线安装工具
语法:
yum [options] [command] [package ...]
常用选项:
yum clean all 清空缓存
yum makecache 创建缓存
yum install xxx 安装软件
yum -y install xxx 取消交互
yum remove xxx 卸载软件
yum update 更新本系统中已经安装的所有软件包(比仓库里版本低都更新)
yum update xxx 单独更新某个软件
yum list 列出仓库里所有的软件包
yum list |grep xxx 过滤某个软件包 @代表已经安装,后面跟的是来自于-x哪个仓库
yum list installed 查看当前操作系统中已经安装的所有软件包
yum list installed|grep tigervnc
yum localinstll xxx.rpm 安装本地的rpm包
yum search xxx 搜索相关包
repoquery -ql gstreamer # 不安装软件查看包含文件
对应组的用法:
yum grouplist 查看包组
yum groupinstall -y "包组名" 安装一个包组
yum grouplist
yum groupinstall 组名
yum groupinstall "组名1 组名2"
yum groupremove 组名
示例:
本地yum源步骤:1)本地需要有一个镜像文件2)挂在镜像文件到操作系统的挂在点,并且开机自动挂载mkdir /yum 创建一个挂在点# mount /mnt/hgfs/soft/rhel-server-6.5-x86_64-dvd.iso /yum -o loop 手动挂载vim /etc/fstab 开机自动挂在/mnt/hgfs/soft/rhel-server-6.5-x86_64-dvd.iso /yum iso9660 defaults,ro,loop 0 03)配置yum源# vim /etc/yum.conf --主配置文件,但一般不用它/etc/yum.repos.d/xxx.repo --这个目录下只要以.repo结尾的文件就是子配置文件# rm /etc/yum.repos.d/* -rf --默认有两文件,没用,删掉# vim /etc/yum.repos.d/localyum.repo --新建一个以repo结尾的文件就可以[server] --软件仓库名,自定义name=server --标识名,自定义baseurl=file:///yum/ --这一条最重要,它表示你的仓库的地址。本地仓库的写法file:/// 要接三个/enabled=1 --等于1表示打开仓库,等于0表示不使用此仓库gpgcheck=0 --不验证gpg签名上面这一段配置就包含了iso镜像里的大部分软件,完整的配置如下:(这是redhat镜像的详细配置)[server]name=serverbaseurl=file:///yum/enabled=1gpgcheck=0[HighAvailability]name=HighAvailabilitybaseurl=file:///yum/HighAvailability/enabled=1gpgcheck=0[LoadBalancer]name=LoadBalancerbaseurl=file:///yum/LoadBalancer/enabled=1gpgcheck=0[ResilientStorage]name=ResilientStoragebaseurl=file:///yum/ResilientStorage/enabled=1gpgcheck=0[ScalableFileSystem]name=serverbaseurl=file:///yum/ScalableFileSystemenabled=1gpgcheck=0
补充:
yum使用epel源# 包下载地址: http://download.fedoraproject.org/pub/epel # 选择版本5\6\7rpm -Uvh http://mirrors.hustunique.com/epel//6/x86_64/epel-release-6-8.noarch.rpm# 自适配版本yum install epel-release自定义yum源find /etc/yum.repos.d -name "*.repo" -exec mv {} {}.bak \;vim /etc/yum.repos.d/yum.repo[yum]#httpbaseurl=http://10.0.0.1/centos5.5#挂载iso#mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /data/iso/#本地#baseurl=file:///data/iso/enable=1#导入keyrpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5编译源码安装./configure --help # 查看所有编译参数./configure --prefix=/usr/local/ # 配置参数make # 编译# make -j 8 # 多线程编译,速度较快,但有些软件不支持make install # 安装包make clean # 清除编译结果perl程序编译perl Makefile.PLmakemake testmake installpython程序编译python file.py源码包编译安装python setup.py buildpython setup.py install编译c程序gcc -g hello.c -o hello
13.7.watch
功能:检测一个命令的运行结果
常用参数:
-n或--interval watch缺省每2秒运行一下程序,可以用-n或-interval来指定间隔的时间。
-d或--differences 用-d或--differences 选项watch 会高亮显示变化的区域。 而-d=cumulative选项会把变动过的地方(不管最近的那次有没有变动)都高亮显示出来。
-t 或-no-title 会关闭watch命令在顶部的时间间隔,命令,当前时间的输出。
-h, --help 查看帮助文档
示例:
每隔一秒高亮显示网络链接数的变化情况watch -n 1 -d netstat -ant每隔一秒高亮显示http链接数的变化情况watch -n 1 -d 'pstree|grep http'实时查看模拟***客户机建立起来的连接数watch 'netstat -an | grep:21 | \ grep<模拟***客户机的IP>| wc -l'监测当前目录中 scf' 的文件的变化watch -d 'ls -l|grep scf'10秒一次输出系统的平均负载watch -n 10 'cat /proc/loadavg'
13.8.alias
功能:定义别名
常用选项:
-p:打印现有的所有别名(唯一参数)
示例:
#alias kk=ls 只在当前终端生效#unalias kk 取消别名#vim /root/.bashrc 永久定义别名,局部配置文件(针对root)#alias kk='ls -l'#source ~/.bashrc 或者. ~/.bashrc 立刻马上生效#vim /etc/bashrc 让所有的用户都生效(全局)
13.9.unalias
功能:删除别名
语法:unalias [-a][别名]
常用选项:
-a 删除全部的别名
示例:
[root@localhost ~]# alias lx=ls[root@localhost ~]# lx[root@localhost ~]# alias lx #查看别名alias lx='ls'[root@localhost ~]# unalias lx #删除别名[root@localhost ~]# lx-bash: lx: command not found
13.10.clear
功能:清屏
ctrl+L也有同样效果
13.11.history
功能:打印或操作历史命令列表
常用选项:
-c:清空命令历史
-d n:删除指定历史命令,n表示命令行号
#:显示最近的#条历史命令
-a:追加本次会话新执行的历史命令列表到历史文件中
-n:读取历史命令文件中未读过的行到历史列表,这里的历史命令文件指的是存储历史命令的文件,历史列表是执行history的列表
-r:读取历史文件中的命令到当前历史列表,也就是history
-w:保存历史列表到历史命令文件中
history相关的环境变量:
HISTFILE 指定存放历史文件位置,默认位置在~/.bash_profile,/etc/profile(针对全局 )
HISTFILESIZE 命令历史文件记录历史的条数
HISTSIZE 命令历史记录的条数,默认为1000
HISTTIMEFORMAT="%F %T" 显示命令发生的时间
HISTIGNORE="str1:str2:..." 忽略string1,string2历史
HISTCONTROL 包含一下4项,让哪一项生效只需要让其=下面一项即可
ignoredups: 忽略重复的命令;连续且相同方为“重复”
ignorespace: 忽略所有以空白开头的命令
ignoreboth:ignoredups,ignorespace
erasedups: 删除重复命令
history常用的快捷键
重新调用前一个命令中最后一个参数:
!$
Esc, .(点击Esc键后松开,然后点击. 键)
!!:调用上一条命令
示例:[root@localhost ~]# history |wc -l1000[root@localhost ~]# history -c #-c是清空历史列表而非历史文件中的命令[root@localhost ~]# history |wc -l1[root@localhost ~]# history -r #-r加了历史文件中的命令,又有1000条命令[root@localhost ~]# history |wc -l1000[root@localhost ~]# history.......................2136 mv /home/yyl01/file{1..5} /home/yyl01/redhat/test/2137 cd /home/yyl01/redhat/test/2138 ls2139 mv file{1..5} test1 test2 test3 test4 test52140 ls2141 ls *|sed -i 's/file/test/g'2142 ls *2143 echo *2144 echo * |sed -i 's/file/test/g'2145 history |wc-l2146 history |wc -l2147 history[root@localhost ~]# history -d 2139[root@localhost ~]# history.........2137 cd /home/yyl01/redhat/test/2138 ls2139 ls2140 ls *|sed -i 's/file/test/g'2141 ls *2142 echo *2143 echo * |sed -i 's/file/test/g'2144 history |wc-l2145 history |wc -l2146 history2147 history -d 21392148 history[root@localhost ~]# history -n 跟-r命令效果差不多,只是以未读到历史列表中的会读到,而不是像-r所有[root@localhost ~]# cat .bash_history |wc -l #说明只能存1000个命令1000[root@localhost ~]# history -w #-w存入也是覆盖掉以前的,继续是1000个命令
13.12.eject
功能:退出抽取式设备
若设备已挂入,则eject会先将该设备卸除再退出
常用参数:
[设备] 设备可以是驱动程序名称,也可以是挂入点。
-a<开关>或--auto<开关> 控制设备的自动退出功能。
-c<光驱编号>或--changerslut<光驱编号> 选择光驱柜中的光驱。
-d或--default 显示预设的设备,而不是实际执行动作。
-f或--floppy 退出抽取式磁盘。
-h或--help 显示帮助。
-n或--noop 显示指定的设备。
-q或--tape 退出磁带。
-r或--cdrom 退出光盘。
-s或--scsi 以SCSI指令来退出设备。
-t或--trayclose 关闭光盘的托盘。
-v或--verbose 执行时,显示详细的说明。
示例:
# eject //不加参数默认弹出# eject -r /dev/cdrom //指定设备
13.13.time
功能:统计给定命令所话费的总时间
示例:
[root@localhost ~]# time ls.........real 0m0.002suser 0m0.001ssys 0m0.001sreal指命令开始执行到结束的时间user指进程花费在用户模式中的CPU时间sys指花费在内核模式中的CPU时间使用-o选项将执行时间写入到文件中/usr/bin/time -o outfile.txt ls使用-a选项追加信息/usr/bin/time -a -o outfile.txt ls使用-f选项格式化时间输出/usr/bin/time -f "time: %U" ls
13.14.nc
功能:是一个功能强大的网络工具,全称是netcat。查看TCP和UDP连接和侦听
语法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
常用选项:
-g <网关> 设置路由器跃程通信网关
-G <指向器数目> 设置来源路由指向器,其数值为4的倍数
-h 在线帮助
-i interval<延迟秒数> 指定间隔时间发送和接受行文本
-l 监听模式,管控传入的资料
-n 直接使用IP地址,而不通过域名服务器
-o <输出文件> 指定文件名称,把往来传输的数据以16进制文件保存
-p <通信端口>指定本地源端口
-r 指定本地和远程主机端口
-s <来源位址>指定本地源IP地址
-u 使用udp协议,默认是tcp
-v 执行过程输出
-w <超时秒数> timeout 连接超时时间
-x proxy_address[:port] 请求连接主机使用代理地址和端口
-z 指定扫描监听端口,不发送任何数据
示例:
安装nc[root@localhost log]# yum install -y nctcp端口扫描:[root@localhost log]# nc -v -z -w2 127.0.0.1 1-100 #扫描本地tcp端口1-100nc: connect to 127.0.0.1 port 1 (tcp) failed: Connection refused......Connection to 127.0.0.1 22 port [tcp/ssh] succeeded![root@localhost log]# nc -z 127.0.0.1 1-65535 #扫描监听的端口Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!Connection to 127.0.0.1 35186 port [tcp/*] succeeded!简单聊天工具:[root@docker-node5 ~]# nc -l 1234 #在192.168.19.6上开启1234端口作为聊天端口[root@localhost log]# nc 192.168.19.6 1234 #在192.168.19.20同样开启1234端口为聊天端口开始聊天:[root@localhost log]# nc 192.168.19.6 1234dff[root@docker-node5 ~]# nc -l 1234 这边的屏幕就会输出刚才的dff信息dff使用ctrl+C(或D)退出拷贝文件:[root@docker-node5 ~]# nc -l 1234 > test.txt[root@localhost log]# nc 192.168.19.6 1234 < test.txt
13.15.export
功能:设置或显示环境变量
常用参数:
f 代表[变量名称]中为函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的shell赋予程序的环境变量。
示例:
[root@localhost ~]# export -p #列出当亲啊的环境变量值[root@localhost ~]# export MYENV 定义环境变量[root@localhost ~]# export -p |grep MYENV 列出当前的环境变量declare -x MYENV[root@localhost ~]# export MYENV=7 #定义环境变量并赋值[root@localhost ~]# export -p |grep MYENVdeclare -x MYENV="7"
13.16.unset
功能:取消变量或函数
常用参数:
-f 仅删除函数。
-v 仅删除变量。
示例:
[root@localhost ~]# a=123[root@localhost ~]# echo $a123[root@localhost ~]# unset a[root@localhost ~]# echo $a[root@localhost ~]#
13.17.type
功能:显示指定命令的类型
命令类型有如下情形:
alias 别名
keyword 关键字,Shell保留字
function 函数,Shell函数
builtin 内建命令,Shell内建命令
file 文件,磁盘文件,外部命令
unfound 没有找到
常用选项:
-a:显示所有类型
-p:外部命令信息,相当于which
-f:shell函数信息
-t:指定类型信息
示例:
[root@localhost ~]# type echo echo is a shell builtin #内建命令# type gtypistgtypist is /usr/local/bin/gtypist #外部命令[root@localhost ~]# type lsls is aliased to `ls --color=auto' 别名[root@localhost ~]# type -a type #自己属于内建命令type is a shell builtin[root@localhost ~]# type -a pwdpwd is a shell builtinpwd is /bin/pwd[root@localhost ~]# type -a timetime is a shell keyword[root@localhost ~]# type -a whichwhich is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'which is /usr/bin/which
13.18. tee
功能:从标准输入读取,写到标准输出和文件
语法:tee [OPTION]... [FILE]...
常用选项:
-a 追加到文件
示例:
[root@localhost ~]# echo 123 |tee -a 123123[root@localhost ~]# cat 123123说明:不过这样不觉得这个命令增加工作量,输入追加echo命令就可以做到
13.19.read
功能:接收标准输入,或其他文件描述符的输入
常用选项:
-d:输入结束符,默认结束符是换行
-p:提示语句
-n:字符个数
-t:等待时间
-s:不回显
-a:数组名
示例:
[root@localhost scripts]# cat read01.sh#!/bin/bashecho -n "enter your name:" #参数-n不换行,默认是换行的read name read #读入变量,后边的echo才能引用变量echo "hello $name"执行结果:[root@localhost scripts]# sh read01.shenter your name:yylhello yyl[root@localhost scripts]# sh read01.sh #没有read的读入,变量name不起作用,结果就是底下这样enter your name:hello[root@localhost scripts]# cat read01.sh#!/bin/bashecho -n "enter your name:"echo "hello $name"-p参数使用[root@localhost scripts]# sh read01.shenter your name:yylhello yyl[root@localhost scripts]# cat read01.sh#!/bin/bashread -p "enter your name:" nameecho "hello $name"是不是比echo的效果好很多-t参数使用[root@localhost scripts]# sh read02.shenter your name:yylhello yyl[root@localhost scripts]# sh read02.sh 计时到时,会自动退出脚本enter your name:sorry,timeout[root@localhost scripts]# cat read02.sh#!/bin/bashif read -t 10 -p "enter your name:" name;thenecho "hello $name"elseecho "sorry,timeout"fi-n参数使用[root@localhost scripts]# sh read03.shenter your name:yylhello yyl[root@localhost scripts]# sh read03.shenter your name:dfdUsage:YYL|yyl PXT|pxt[root@localhost scripts]# sh read03.shenter your name:pxtfine,pxt[root@localhost scripts]# cat read03.sh#!/bin/bashread -n3 -p "enter your name:" namecase $name inYYL|yyl)echo -e "\nhello $name";;PXT|pxt)echo -e "\nfine,$name";;*)echo -e "\nUsage:YYL|yyl PXT|pxt";;esac说明:使用-n后,后接3,表示read接到3个字符就对出,只要有字符输入,read就会接受输入传给变量,无需按回车-s选项使用[root@localhost scripts]# sh read01.shenter your name:hello yyl[root@localhost scripts]# cat read01.sh#!/bin/bashread -s -p "enter your name:" nameecho "hello $name"说明:-s会隐藏你输入的信息,起到一个安全保护的作用运用read读取文件[root@localhost scripts]# sh read04.shLINE 1:root:x:0:0:root:/root:/bin/bash................................LINE 22:yyl:x:500:500::/home/yyl:/bin/bashprint ok[root@localhost scripts]# sh read05.shLINE :root:x:0:0:root:/root:/bin/bash................................LINE :yyl:x:500:500::/home/yyl:/bin/bashprint ok[root@localhost scripts]# cat read04.sh read05.sh#!/bin/bashcount=1 #加入count是为了加入行号cat /etc/passwd |while read line;do #把cat查看的文件作为read的读入,一行行读取echo "LINE $count:$line"count=$[ $count + 1 ] #每循环count加1doneecho "print ok"#!/bin/bash #这个脚本没有加入count,它也会一行行去读取,只是少了行号cat /etc/passwd |while read line;doecho "LINE $count:$line"doneecho "print ok"
13.20.linux的计算器(bc、expr、dc、echo、awk)
1)bc
功能:linux命令行计算器
示例:
2)expr
功能:计算器,表达式丰富
示例:
[root@localhost ~]# expr 6 + 3 (字符数字之间有空格)9[root@localhost ~]# expr 2 \* 3 (特殊字符要转义)6[root@localhost ~]# expr 14 % 9 (取余)5[root@localhost ~]# a=3[root@localhost ~]# expr $a+5 (无空格)3+5[root@localhost ~]# expr $a + 5 (变量,有空格)8[root@localhost ~]# a=`expr 4 + 2`[root@localhost ~]# echo $a6[root@localhost ~]# expr $a + 39另外,expr对于字串的操作(计算)也是很方便的,如://字串长度# expr length "yangzhigang.cublog.cn"21//从位置处抓取字串# expr substr "yangzhigang.cublog.cn" 1 11yangzhigang//字串开始处# expr index "yangzhigang.cublog.cn" cu13//判断是否是整数[root@localhost ~]# expr a + 3expr: non-numeric argument[root@localhost ~]# echo $? #判断状态2[root@localhost ~]# expr 3 + 36[root@localhost ~]# echo $?0
3)dc
功能:比bc更复杂的计算器
示例:
[root@localhost ~]# dc32+p54*p20quit[root@localhost ~]# echo 3 2+ 4*p |dc20
4)echo
功能:echo除了输入输出还可以做简单计算
[root@localhost ~]# echo $((3+5))8[root@localhost ~]# echo $(((3+5)*2))16变量计算[root@localhost ~]# a=10[root@localhost ~]# b=5[root@localhost ~]# echo $(($a+$b))15[root@localhost ~]# echo $a+$b10+5[root@localhost ~]# echo $a+$b |bc15计算前天日期[root@localhost ~]# echo `date +%Y%m%d`20170913[root@localhost ~]# echo `date +%Y%m%d`-220170913-2[root@localhost ~]# echo `date +%Y%m%d`-2|bc20170911
5)awk
[root@localhost ~]# awk 'BEGIN{a=3+2;print a}'5[root@localhost ~]# awk 'BEGIN{a=(3+2)*2;print a}'10
练习
1、找出根目录下的所有块设备文件,并且将标准输出及标准错误重定向到/tmp/find.test文件中
[root@localhost mnt]# find / -type b > /tmp/find.test 2>&1
2、找出/root目录下小于2M的文件并长列出,同时将其追加到/tmp/find.test文件中
1M:等于1M
+1M:大于1M
-1M:小于1M
[root@localhost mnt]# find /root/ -size -2M -exec ls -l {} \; >>/tmp/find.test
3、在/home/test目录中创建10个文件,并且修改file1~file5的时间为系统时间的5天前,file6的时间为5月28,file7的为5月29,file8的为5月30
[root@localhost home]# pwd
/home[root@localhost home]# touch file{1..10}[root@localhost home]# lsfile1 file2 file4 file6 file8 old01 old03 old05 old07 old09 yylfile10 file3 file5 file7 file9 old02 old04 old06 old08 old10 yyl01[root@localhost home]# touch -d $(date +%Y%m%d) --date="6 days ago" file{1..5}[root@localhost home]# lltotal 48-rw-r--r-- 1 root root 0 May 25 15:37 file1-rw-r--r-- 1 root root 0 May 31 15:35 file10-rw-r--r-- 1 root root 0 May 25 15:37 file2-rw-r--r-- 1 root root 0 May 25 15:37 file3-rw-r--r-- 1 root root 0 May 25 15:37 file4-rw-r--r-- 1 root root 0 May 25 15:37 file5-rw-r--r-- 1 root root 0 May 31 15:35 file6-rw-r--r-- 1 root root 0 May 31 15:35 file7-rw-r--r-- 1 root root 0 May 31 15:35 file8-rw-r--r-- 1 root root 0 May 31 15:35 file9[root@localhost home]# touch -d 20170528 file6[root@localhost home]# touch -d 20170529 file7[root@localhost home]# touch -d 20170530 file8[root@localhost home]# lltotal 48-rw-r--r-- 1 root root 0 May 25 15:37 file1-rw-r--r-- 1 root root 0 May 31 15:35 file10-rw-r--r-- 1 root root 0 May 25 15:37 file2-rw-r--r-- 1 root root 0 May 25 15:37 file3-rw-r--r-- 1 root root 0 May 25 15:37 file4-rw-r--r-- 1 root root 0 May 25 15:37 file5-rw-r--r-- 1 root root 0 May 28 00:00 file6-rw-r--r-- 1 root root 0 May 29 00:00 file7-rw-r--r-- 1 root root 0 May 30 00:00 file8-rw-r--r-- 1 root root 0 May 31 15:35 file9
要求:1)找出5天以前的文件并将其拷贝到/backup目录
[root@localhost home]# find ./ -mtime +5 -ok cp {} /backup/ \;
2)找出5天以内的文件并将其拷贝到192.168.5.1上的/home/test目录里,并且重命名成自己的名字。redhat用户密码为123
[root@localhost home]# find /home/redhat -mtime -5 -exec scp {} [email protected]:/home/test/zhangsan \;
4.将/etc/passwd文件拷贝到/tmp目录下面。在/tmp/passwd文件的第15行下添加“hello yyl”,并复制其下5行,粘贴在文件的最下面,保存。然后全文搜索将“/bin/bash”替换成yyl,并保存后面20行到 /tmp/passwd.bak文件中,退出编辑。
解答:
cp /etc/passwd /tmp:15 按o到下行添加“hello yyl”按esc光标移动下行5yy shift+g end p:%s/\/bin\/bash/yyl/g:set nu:11,30w /tpm/passwd.bak
5.找出/etc/下面的所有目录并将其重定向到/tmp/etcdir文件里
方法一:[root@localhost tmp]# ll /etc/ >> /tmp/123[root@localhost tmp]# cat /tmp/123 |grep ^d >> /tmp/etcdir方法二:root@localhost tmp]# ll /etc/ |grep ^d >> /tmp/etcdir方法三:ls#!/bin/bashls -l /etc/* | grep "^d" >> /tmp/ccc.txtif [ $? -eq 0 ];thenecho "file is create successed"elseecho "file is create failed"fi方法四:(用while+read循环)[root@localhost scripts]# cat Dir.sh#!/bin/bashls -l /etc/|grep ^d |while read line;doecho $line >>/tmp/etcdirdonecat /tmp/etcdir |wc -l
6.在/tmp/etcdir文件中追加“好好学习,天天向上”,然后把/etc/passwd文件的内容添加到/tmp/etcdir文件里,并重命名为newetcdir
[root@localhost scripts]# echo "好好学习,天天向上" >> /tmp/etcdir[root@localhost scripts]# cat /etc/passwd >> /tmp/etcdir[root@localhost scripts]#mv /tmp/etcdir /tmp/newetcdir另外一种方法:[root@localhost scripts]# rename "etcdir" "newetcdir" /tmp/etcdir
7.小实验
一个终端 tail -f /var/log/messages
另一个终端logger -t "任何信息" " 任何信息" (logger命令后边说)
再观察第一个终端的变化
[root@localhost ~]# tail -f /var/log/messagesMay 26 11:11:24 localhost 任何信息: 任何信息May 26 11:11:35 localhost 任何信息: 任何信息[root@localhost ~]# logger -t "任何信息" " 任何信息"