命令(20个)node
echo,printf,rpm,yum,watch,alias,unalias,clear,history,eject,time,nc,xargs,exec,export,unset,type,bc,tee,read
python
13.1.xargs
mysql
功能:从标准输入来执行命令linux
经常使用选项:sql
-a file 从指定文件读取数据做为标准输入docker
-0 处理包含空格的文件名,print0shell
-d delimiter 分隔符,默认是空格分隔显示数据库
-i 标准输入的结果以{}代替vim
-I 标准输入的结果以指定的名字代替centos
-t 显示执行命令
-p 交互式提示是否执行命令
-n 最大命令行参数
--show-limits 查看系统命令行长度限制
示例:
上面find的例子已经不少了
介绍两个经常使用的:
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[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</span>
13.2.exec
exec命令 |
做用 |
exec ls |
在shell中执行ls,ls结束后不返回原来的shell中了 |
exec <file |
将file中的内容做为exec的标准输入 |
exec >file |
将file中的内容做为标准写出 |
exec 3<file |
将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
<logout>
[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 <test
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</root/test
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
练习
一、找出根目录下的全部块设备文件,而且将标准输出及标准错误重定向到/tmp/find.test文件中
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[root@localhost mnt]# find / -type b > /tmp/find.test 2>&1</span>
二、找出/root目录下小于2M的文件并长列出,同时将其追加到/tmp/find.test文件中
1M:等于1M
+1M:大于1M
-1M:小于1M
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[root@localhost mnt]# find /root/ -size -2M -exec ls -l {} \; >>/tmp/find.test </span>
三、在/home/test目录中建立10个文件,而且修改file1~file5的时间为系统时间的5天前,file6的时间为5月28,file7的为5月29,file8的为5月30
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[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</span>
要求:1)找出5天之前的文件并将其拷贝到/backup目录
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[root@localhost home]# find ./ -mtime +5 -ok cp {} /backup/ \;</span>
2)找出5天之内的文件并将其拷贝到192.168.5.1上的/home/test目录里,而且重命名成本身的名字。redhat用户密码为123
<span data-wiz-span="data-wiz-span" style="font-size: 1.167rem;">[root@localhost home]# find /home/redhat -mtime -5 -exec scp {} redhat@192.168.5.1:/home/test/zhangsan \;</span>
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 "任何信息" " 任何信息"