命令(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中执行lsls结束后不返回原来的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#ls
exp1  exp5  linux-2.6.27.54  ngis_post.sh  test  text  xen-3.0.1-install
root@localhost:~/test#pwd
/root/test
root@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]# ls
0  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/test
root    tty1        2017-06-04 10:28
root    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)
0
1
2
255
3

应用举例:
[root@localhost scripts]# cat ex.sh
#!/bin/bash
exec 3 
  
while read -u 3 pkg;do
  echo "$pkg"
done
[root@localhost scripts]# sh ex.sh
root    tty1        2017-06-04 10:28
root    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)
0
1
2
255
3

exec 3>&1 4>&2 1>> zhis_bash.log 2>&1
其含义是 复制标准输出到3 错误输出到 4 把 3 4 保存在zhis_bash.log  这个文件中等同于 再写一个shell 类似
[sql] view plain copy
cat another shell
./zhis_bash.sh >>zhis_bash.log  2>&1

如果exec 跟的是其他命令,则其他命令结束后,本shell也随之停止
[root@localhost ~]# cat test_exec.sh
#!/bin/bash
echo "hello mysql"
exec echo " hello oracle"
echo "hello db2"
运行一下
[root@localhost ~]# ./test_exec.sh
hello mysql
hello 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定义为换行字符,这样才会换行打印
1
2
3
[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 1
hello,world
[root@localhost ~]# echo welcome to linux world >> 1 #echo的追加功能
[root@localhost ~]# cat 1
hello,world
welcome 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.314529
1.31
#格式化打印:
[root@localhost test]# printf "user: %s\tpassword: %d\n" root 123
user: root    password: 123
#左对齐宽度5
[root@localhost test]# printf "%-5s  %-5s %-5s\n" 1 2 3
1      2    3
#右对齐宽度5
[root@localhost test]# printf "%5s  %5s %5s\n" 1 2 3
    1      2    3
#每行右对齐
[root@localhost test]# printf "%5s\n" 1 2 3
    1
    2
    3
#每行左对齐
[root@localhost test]# printf "%-5s\n" 1 2 3
1
2
3



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.rpm
warning: zsh-4.3.10-5.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                                                  ########################################### [100%]
  1:zsh                                                      ########################################### [100%]
--这是成功安装

# rpm -ivh zsh-4.3.10-5.el6.x86_64.rpm
warning: zsh-4.3.10-5.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                                                  ########################################### [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-release

2)依赖性的问题:
# rpm -ivh mysql-5.1.61-4.el6.x86_64.rpm
error: Failed dependencies:
    libmysqlclient.so.16()(64bit) is needed by mysql-5.1.61-4.el6.x86_64
    libmysqlclient.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.61-4.el6.x86_64
    libmysqlclient_r.so.16()(64bit) is needed by mysql-5.1.61-4.el6.x86_64
    libmysqlclient_r.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.61-4.el6.x86_64
    mysql-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.rpm

3)冲突:
报错里有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和--replacepkgs
rpm -ivh --test    测试是否能安装到此linux系统中

rpm -qa            --查看你系统上已经安装的rpm包(注意,只限于rpm包)
# rpm -qa |grep mysql

rpm -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 0


3)配置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=server
baseurl=file:///yum/
enabled=1
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=file:///yum/HighAvailability/
enabled=1
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=file:///yum/LoadBalancer/
enabled=1
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=file:///yum/ResilientStorage/
enabled=1
gpgcheck=0
[ScalableFileSystem]
name=server
baseurl=file:///yum/ScalableFileSystem
enabled=1
gpgcheck=0

补充:

 

yum使用epel源
        # 包下载地址: http://download.fedoraproject.org/pub/epel  # 选择版本5\6\7
        rpm -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]
        #http
        baseurl=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
        #导入key
        rpm --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.PL
            make
            make test
            make install
python程序编译
            python file.py
源码包编译安装
            python setup.py build
            python 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 -l
1000
[root@localhost ~]# history -c  #-c是清空历史列表而非历史文件中的命令
[root@localhost ~]# history |wc -l
1
[root@localhost ~]# history -r  #-r加了历史文件中的命令,又有1000条命令
[root@localhost ~]# history |wc -l
1000
[root@localhost ~]# history
.......................
2136  mv /home/yyl01/file{1..5} /home/yyl01/redhat/test/
2137  cd /home/yyl01/redhat/test/
2138  ls
2139  mv file{1..5} test1 test2 test3 test4 test5
2140  ls
2141  ls *|sed -i 's/file/test/g'
2142  ls *
2143  echo *
2144  echo * |sed -i 's/file/test/g'
2145  history |wc-l
2146  history |wc -l
2147  history
[root@localhost ~]# history -d 2139
[root@localhost ~]# history
.........
2137  cd /home/yyl01/redhat/test/
2138  ls
2139  ls
2140  ls *|sed -i 's/file/test/g'
2141  ls *
2142  echo *
2143  echo * |sed -i 's/file/test/g'
2144  history |wc-l
2145  history |wc -l
2146  history
2147  history -d 2139
2148  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.002s
user    0m0.001s
sys      0m0.001s
real指命令开始执行到结束的时间
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 nc
tcp端口扫描:
[root@localhost log]# nc -v -z -w2 127.0.0.1 1-100  #扫描本地tcp端口1-100
nc: 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 1234
dff
[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 MYENV
declare -x MYENV="7"

13.16.unset

功能:取消变量或函数

常用参数:

-f  仅删除函数。

-v    仅删除变量。

示例:

 

[root@localhost ~]# a=123
[root@localhost ~]# echo $a
123
[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 gtypist
gtypist 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 pwd
pwd is a shell builtin
pwd is /bin/pwd
[root@localhost ~]# type -a time
time is a shell keyword
[root@localhost ~]# type -a which
which 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 123
123
[root@localhost ~]# cat 123
123
说明:不过这样不觉得这个命令增加工作量,输入追加echo命令就可以做到

13.19.read

功能:接收标准输入,或其他文件描述符的输入

常用选项:

-d:输入结束符,默认结束符是换行

-p:提示语句

-n:字符个数

-t:等待时间

-s:不回显

-a:数组名

示例:

 

[root@localhost scripts]# cat read01.sh
#!/bin/bash
echo -n "enter your name:" #参数-n不换行,默认是换行的
read name  read  #读入变量,后边的echo才能引用变量
echo "hello $name"
执行结果:
[root@localhost scripts]# sh read01.sh
enter your name:yyl
hello yyl

[root@localhost scripts]# sh read01.sh #没有read的读入,变量name不起作用,结果就是底下这样
enter your name:hello
[root@localhost scripts]# cat read01.sh
#!/bin/bash
echo -n "enter your name:"
echo "hello $name"

-p参数使用
[root@localhost scripts]# sh read01.sh
enter your name:yyl
hello yyl
[root@localhost scripts]# cat read01.sh
#!/bin/bash
read -p "enter your name:" name
echo "hello $name"
是不是比echo的效果好很多

-t参数使用
[root@localhost scripts]# sh read02.sh
enter your name:yyl
hello yyl
[root@localhost scripts]# sh read02.sh  计时到时,会自动退出脚本
enter your name:sorry,timeout
[root@localhost scripts]# cat read02.sh
#!/bin/bash
if read -t 10 -p "enter your name:" name;then
  echo "hello $name"
else
  echo "sorry,timeout"
fi

-n参数使用
[root@localhost scripts]# sh read03.sh
enter your name:yyl
hello yyl
[root@localhost scripts]# sh read03.sh
enter your name:dfd
Usage:YYL|yyl PXT|pxt
[root@localhost scripts]# sh read03.sh
enter your name:pxt
fine,pxt
[root@localhost scripts]# cat read03.sh
#!/bin/bash
read -n3 -p "enter your name:" name
case $name in
YYL|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.sh
enter your name:hello yyl
[root@localhost scripts]# cat read01.sh
#!/bin/bash
read -s -p "enter your name:" name
echo "hello $name"
说明:-s会隐藏你输入的信息,起到一个安全保护的作用

运用read读取文件
[root@localhost scripts]# sh read04.sh
LINE 1:root:x:0:0:root:/root:/bin/bash
................................
LINE 22:yyl:x:500:500::/home/yyl:/bin/bash
print ok
[root@localhost scripts]# sh read05.sh
LINE :root:x:0:0:root:/root:/bin/bash
................................
LINE :yyl:x:500:500::/home/yyl:/bin/bash
print ok
[root@localhost scripts]# cat read04.sh  read05.sh
#!/bin/bash
count=1 #加入count是为了加入行号
cat /etc/passwd |while read line;do #把cat查看的文件作为read的读入,一行行读取
  echo "LINE $count:$line"
  count=$[ $count + 1 ]    #每循环count加1
done
echo "print ok"

#!/bin/bash  #这个脚本没有加入count,它也会一行行去读取,只是少了行号
cat /etc/passwd |while read line;do
  echo "LINE $count:$line"
done
echo "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 $a
6
[root@localhost ~]# expr $a + 3
9
另外,expr对于字串的操作(计算)也是很方便的,如:
//字串长度
# expr length "yangzhigang.cublog.cn"
21

//从位置处抓取字串
# expr substr "yangzhigang.cublog.cn" 1 11
yangzhigang

//字串开始处
# expr index "yangzhigang.cublog.cn" cu
13
//判断是否是整数
[root@localhost ~]# expr a + 3
expr: non-numeric argument
[root@localhost ~]# echo $?  #判断状态
2
[root@localhost ~]# expr 3 + 3
6
[root@localhost ~]# echo $?
0

3)dc

功能:比bc更复杂的计算器

示例:

 

[root@localhost ~]# dc
3
2+
p
5
4*
p
20
quit
[root@localhost ~]# echo 3 2+ 4*p |dc
20

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+$b
10+5
[root@localhost ~]# echo $a+$b |bc
15
计算前天日期
[root@localhost ~]# echo `date +%Y%m%d`
20170913
[root@localhost ~]# echo `date +%Y%m%d`-2
20170913-2
[root@localhost ~]# echo `date +%Y%m%d`-2|bc
20170911

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]# ls
file1   file2  file4  file6  file8  old01  old03  old05  old07  old09  yyl
file10  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]# ll
total 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]# ll
total 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/bash
ls -l /etc/* | grep "^d" >> /tmp/ccc.txt
if [ $? -eq 0 ];then
      echo "file is create successed"
else
      echo "file is create failed"
fi
方法四:(用while+read循环)
[root@localhost scripts]# cat Dir.sh
#!/bin/bash
ls -l /etc/|grep ^d |while read line;do
    echo $line >>/tmp/etcdir
done
cat /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/messages
May 26 11:11:24 localhost 任何信息:  任何信息
May 26 11:11:35 localhost 任何信息:  任何信息
[root@localhost ~]# logger -t "任何信息" " 任何信息"