-name
find . -name "*.log" -a -size +2k -print-type
find . -type f -name "*log" -print-size
find . -type f -name "*log" -size +337c -print-print
find . -name "*.log" -print-exec(-ok会有提示)
find . -name "*.log" -exec mv {} cdr \;
find . -name "*.log" –ok rm –r {} \;-atime -mtime
find . -type f -atime +10 -mtime +10-maxdepth
find . -maxdepth 1 -type f -print
不查询子目录
find . -type f -mtime +10 -exec rm -rf {} \;
删除10天以前的文件,不包括10天当天
find . -type f -mtime 10 -exec rm -rf {} \;
删除10天前当天文件。
find . -type f -mtime -10 -exec rm -rf {} \;
删除10天以内,包括今天,不包括10天当天
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理
-n:
传递参数个数
一次查看多个.tar.gz文件 find . -name "*gz" | xargs -n 1 tar -tvf
-i:
表示 find 传递给xargs的结果 由{}来代替
一次重命名多个文件 find . -type f | xargs -t -i mv {} {}.bak
-p:
交互式提问y来确认命令的每次执行
-t:
在执行前回显各个command
mtime/ctime/atime的区别
mtime:
修改时间,这个时间指的是文件内容修改的时间,而不是文件属性的修改,当数据内容修改时,这个时间就会改变,用命令ls -l默认显示的就是这个时间。
ctime:
改变时间,当一个文件的状态改变时,这个时间就会改变,例如更改了文件的权限与属性等,它就会改变。
atime:
当读取文件内容时,就会更改这个时间,例如使用cat 去读取/etc/man.config,那么该文件的atime就会改变。
grep命令的使用
-c :
计算找到 '搜寻字符串' 的次数
-i :
忽略大小写的不同,所以大小写视为相同
-n :
顺便输出行号
-v :
反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
-A :
搜索行之后 n 行
-B :
搜索行之前 n 行
-E :
--text扩展的正则(ps -ef | grep -E 'ycq|CMD')
tar gzip 压缩解压
.gz
gzip:
用来压缩文件
zcat:
用来查看压缩过的文本文件的内容
gunzip:
用来解压文件
gzip file_name
将文件压缩为file_name.gz 并删除原文件file_name
gunzip file_name.gz
将 file_name.gz解压缩,然后删除。
.zip
zip:
创建一个压缩文件,包含指定的文件和目录 # zip -r shell.tar /home/prm/shell
zipcloak:
创建一个加密的压缩文件,包含指定的文件和目录
zipnote:
从zip文件中提取批注
unzip:
从压缩过的zip文件中提取文件和目录
.tar 的使用
tar 命令(一次只能选一个):
-c --create
创建一个新的tar归档文件 tar -cvf name.tar dir1 dir2tar -czvf name.tar.gz dir1 dir2
-t --list
列出已有tar归档文件的内容 tar -tvf name.tar.gz
-x --extract
从已有tar归档文件中提取文件 tar -xzvf name.tar.gz [file1]
file 是可选的,如果有file,则直接解压该file,不全部解压。
tar 命令选项:
-f
输出结果到文件或设备file
-v
在处理文件时显示文件
-z
将输出重定向给gzip命令来压缩内容
--strip-components=4
解压后,删除目录层数
split 的使用
将一个大的文件拆分成小的文件:
-a :
指定后缀长度
-b :
每个文件多少字节
-d :
使用数字后缀而不是字母
-l :
指定每个文件的行数
文本文件,按行
split -l 10000 large_file.txt file_prefix
二进制文件,按大小
split -b 10m large_file.log file_prefix
spc
本地到远程:
scp /home/prm/shell/start.sh prm@192.168.3.2:/home/prm/shell
复制目录:
scp -r local_folder remote_username@remote_ip:remote_folder
远程到本地:
scp prm@192.168.3.2:/home/prm/shell /home/prm/shell/start.sh
ssh
安装ssh-server
sudo apt-get install openssh-server
安装ssh-client
sudo apt-get install openssh-client
确认
ps -ef | grep ssh 如果看到ssd,那说明ssh-server已经启动。如果只ssh-agent说明ssh-server还没启动。
启动
/etc/init.d/ssh start 其他命令输入/etc/init.d/ssh
修改ssh端口
修改配置文件/etc/ssh/sshd_config 默认port22 可以修改为其他,然后重启
ssh双机信任:
首先在客户端上创建一对公私钥(公钥文件:~/.ssh/id_rsa.pub;私钥文件:~/.ssh/id_rsa,然后把公钥放到服务器上(~/.ssh/authorized_keys,自己保留好私钥。当ssh登录时,ssh程序会
发送私钥去和服务器上的公钥做匹配。如果匹配成功就可以登录了。
A: 10.75.169.135(prm1a)
B: 10.75.169.138(prm1b)
1. 在A机prm1a用户下执行
ssh-keygen -t rsa# 一路回车
查看结果:
cd ~/.ssh
ll
-rw------- 1 prm1a user 1675 NOV 27 23:34 id_rsa
-rw-r--r-- 1 prm1a user 398 NOV 27 23:34 id_rsa.pub
-rw-r--r-- 1 prm1a user 398 NOV 27 23:34 known_hosts
2. 将公钥证书复制到B机prm1b家目录的.ssh目录下,同时将文件名改为authorized_keys
scp id_rsa.pub prm1b@10.75.169.138:/home/prm1b/.ssh/authorized_keys# 此时需要输入密码因为还没有建立信任关系
3. 现在prm1a登录prm1b就不需要密码了
远程复制: ssh prm1b@10.75.169.138
远程执行命令: ssh prm1b@10.75.169.138 'hostname'
4.同样在B机执行ssh-keygen -t rsa 然后将公钥复制到A机同时将文件名改为authorized_keys,这样prm1b登录prm1a就不需要密码。
ftp
ftp 192.168.3.2 输入:用户名密码
get [remote_file] [local_file]
ftp>get /home/prm/shell/start.sh/home/prm/shell/start.sh
mget [remote_files]
文件将下载到当前主机运行ftp目录下,如果你在/home/prm/shell目录下执行,则下载到本地该目录(关闭交互:prompt on/off)
ftp>cd /home/prm/shell
ftp>mget *.sh
上传文件:
put [local_file] [remote_file]
ftp>put /home/prm/shell/start.sh/home/prm/shell/start.sh
mput [local_files]
将当前目录下文件上传到远端,如果你在/home/prm/shell目录下执行,则上传到远端该目录
ftp>cd /home/prm/shell
ftp>mput *.sh
bye
退出
sudo
如何在普通用户下切换到root,并且不需要输入密码
cat /etc/sudoers
一定不要用vi 编辑这个文件
visudo
要使用这个命令编辑,这个命令会检查语法。
visudo后得到的格式为
账户名 主机名称=(可切换的身份) 可用的指令
root ALL=(ALL) ALL
例如:
prm ALL(root) ALL
prm ALL(root) NOPASSWD: /sbin/ifconfig #以后不用输入密码
普通用户下:
sudo -s #切换到root用户
mailx
基本用法:cat message | mailx -s "subject" -r "from@company.com" -c "copy@company.com" -b "blind@company.com" "to@company.com"
多个人之间用逗号分隔。
-r: 指定发件人
-c: 指定抄送人
-b: 指定密送人
ls 排序
ls -rt 按mtime时间升序
ls -S 按大小排序
df
-h 方便阅读方式显示
-T 文件系统类型
du
du 参数 选项
-a
为每个制定文件显示磁盘使用情况, 或者为目录中每个文件显示各自磁盘使用情况
-b
显示目录或文件大小时, 以byte 为单位
-c
除了显示目录或文件的大小外, 同时也显示所有目录和文件的总和
-h
humanreadable 以K,M,G 为单位,提高信息的可读性
-H
以K,M,G为单位, 以1000 换算而不是1024
-s
summarize 显示当前目录大小,不检查子目录
-m
以兆为单位
例子:显示当前目录下各个子目录占用空间大小:du -sh *
wc
wc 选项 文件
-c
显示文件的Bytes数(字节数)及文件名输出到屏幕上
-l
将每个文件的行数及文件名输出到屏幕上
-m
将每个文件的字符数及文件名输出到屏幕上,如果当前系统不支持多字节字符其将显示与-c参数相同的结果
-w
将每个文件含有多少个词及文件名输出到屏幕上
cut 裁剪
cut -b
按字节,中文3字节.
echo "123456789" | cut -b 1-3# 123
echo "123456789" | cut -b 1-3,6-7 # 12367
echo "123456789" | cut 5,1-3 # 1235 cut会先把-b后面所有的定位进行从小到大排序,然后再提取.
cut -c 按字符,汉4个字一个字符.
echo "123456789" | cut -c 2,6-7# 267
cut -f 按域,-d 默认制表符
echo "192.168.3.2" | cut -d . -f 1,3# 192.3
-b:
指定以字节为单位显示选中内容
-c:
指定以字符为单位显示选中内容
-f:
指定以字段为单位显示选中内容
-d:
指定字段的分界符,默认为制表符
n:
第n个字节/字符/字段
n-:
从第n个字节/字符/字段到最后一个字节/字符/字段
n-m:
从第n个字节/字符/字段到第m个字节/字符/字段,包括m
-m:
从行的开头到第m个字节/字符/字段,包括m
-:
从行开头到行的最后s
tr
tr的所有功能都能够用sed来实现
-c
用to替换from
-d
删除字符串中的字符
-s
删除重复字符序列,保留一个
echo "hello world" | tr "[a-z]" "[A-Z]" # HELLO WORLD
echo "1223445" | tr -d 2 # 13445
echo "1223445" | tr -s 2 # 123445
sort的使用
-f :
忽略大小写的差异,例如 A 与 a 视为编码相同
-b :
忽略最前面的空格符部分
-M :
以月份的名字来排序,例如 JAN, DEC 等等的排序方法
-n :
使用『纯数字』进行排序(默认是以文字型态来排序的)
-r :
反向排序
-u :
就是 uniq ,相同的数据中,仅出现一行代表
-t :
分隔符,默认是用 [tab] 键来分隔
-k :
uniq以那个区间 (field) 来进行排序的意思
命令可以去除排序过的文件中的重复行,uniq经常和sort合用。为了使uniq起作用,所有的重复行必须是相邻的。
-i:
忽略大小写字符的不同;
-c:
进行计数
-u:
只显示唯一的行 # cat file | uniq -uc
-d:
只输出重复行,且只输出一次。# cat file | uniq -dc
date "+%Y-%m-%d %H:%M:%S"
#显示当前时间
date -d "-1 day" +%Y%m%d
#显示前一天的日期
date -d "+1 day" +%Y%m%d
#显示后一天的日期
date -d "-1 month" +%Y%m%d
#显示上一月的日期
date -d "+1 month" +%Y%m%d
#显示下一月的日期
date -d "-1 year" +%Y%m%d
#显示前一年的日期
date -d "+1 year" +%Y%m%d
#显示下一年的日期
date --date="-10 minute"
#显示10分钟前的时间
date -d "10 minute ago"
#显示10分钟前的时间
修改日期
date -s 05/10/2015 #2015年05月10日 0:00:02
例子:
echo `TZ=GMT-8 date '+%Y-%m-%d %H:%M:%S'
2015-12-26 13:34:42
date格式请参考man date
echo `TZ=GMT-8 date -d "1970-01-01 UTC 1451108183 seconds" "+%F %T"`
2015-12-26 13:36:23
useradd
-c
comment 指定一段注释性描述。
-d
指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-u
userad -c “Test User” -d “/home/llj” -m llj用户号指定用户的用户号。
passwd
passwd 选项 用户名
userdel
userdel 选项 用户名
-r 删除用户登入目录以及目录中所有文件
basename获取文件名部分
后缀: 可选参数,指定要去除的文件后缀字符串
file2=`basename $file .sh`.txt
echo $file2 #start.txt
dirname 获取文件的目录部分
watch 周期性执行给定的指令
-n
指定指令执行的间隔时间(秒)
-d
高亮显示指令输出信息不同之处
-t
不显示标题
free
-c
显示次数,同-s一起使用。
-m
以MB为单位显示内存使用情况。
-s <间隔秒数>
Total = used + free持续观察内存使用状况。
-buffers/cache = 47992 = used - buffers - cached 实际已用的内存
+buffers/cache = 459060 = free + buffers + cached 实际可使用内存
从应用程序的角度来说 可用内存=系统free memory+buffers+cached.对操作系统来讲buffers/cached 都是属于被使用
${}
file=/mds/app/vds/wbp/bin/start_onip.sh
${#file}# 342. Substring
${file:0:16}# /mds/app/vds/wbp3. Replace
${file:21} # start_onip.sh
${file/a/A}# /mds/App/vds/wbp/bin/start_onip.sh4. Truncate
${file//a/A} # /mds/App/vds/wbp/bin/stArt_onip.sh
${file#*/}# mds/app/vds/wbp/bin/start_onip.sh 去掉前边1个
${file##*/} # start_onip.sh 去掉前边多个
${file%/*} # /mds/app/vds/wbp/bin
${file%%/*} # ""
利用 ${ } 还可针对不同的变量状态赋值(没设定、空值、非空值${var[:][-+=?]default}:
特殊符号
expr 等价于 $[]
let 等价于 (())
let 必须是等式,expr 必须是表达式,(())可以是等式,也可以是表达式
var=1
expr $var + 1 var2=`expr $var + 1`var3=$[var2+1]
let "var4 = var3+1" ((var5 = var4+1))var6=$((var5 + 1))
echo "scale = 2; 1 / 3" | bc
() 成组命令,成组命令式在新的子shell内执行。分号分隔的命令组,第一个命令和左括号无需空格,最后一个命令后无需分号。
(var=12;echo "hello world")
echo ${var} #没有值
{} 成组命令,成组命令式在benshell内执行。分号分割的命令组,第一个命令和左括号要有空格,最后一个命令后要有分号。
{ var=12;echo "hello world";}
echo ${var} #12
$()
等价于``,$(date)等价于var=`date`
(())
等价于let,let命令表达式必须有等号,expr一定不能有等号,而(())可以有也可以没有let “var=var+1”(变量可以没$) expr $var + 1(变量要有$)
$(())
expr查看返回结果用var=$(expr ...)或`expr ...`。查看(())返回结果用$(()),并且$(())必须赋值一个变量,如果不赋值,则用(())。
var=$((var + 1)),var=$(expr 1 + 2),var=`expr 1 + 2`,var=$((var + 1))
[]
等价于test,<、> 要转义,逻辑组合用-a、-o,各处需要空格
$[]
exprvar =$[ $var + 1]
[[]]
可以认为是]的扩展,支持正则,逻辑组合用&&、||,各处需要空格
{}
当前进程,分号分隔的命令组,第一个命令和左括号要有空格。
${}
变量引用${var}
$#
是传给脚本的参数个数
$0
是脚本本身的名字
$1
是传递给该shell脚本的第一个参数
$2
是传递给该shell脚本的第二个参数
$@
是传给脚本的所有参数的列表
$*
是以一个单字符串显示所有向脚本传递的参数。
$$
是脚本运行的当前进程ID号
$?
是显示最后命令的退出状态,0表示没有错误,其他表示有错误
数组
var="hello,world"
将字符串拆分成数组
按照逗号拆分
IFS=","
array=(${var})
按照空格拆分
array=(${var})
数组内容
echo ${array[@]}
echo ${array[*]}
数组长度
echo ${#array[@]}
echo ${#array[*]}
遍历数组
for file in ${array[*]};do
echo ${file}
done
getopt格式化命令行参数
getopt ab:cd -a parama -b paramb -cd paramc
user shell
查看机器安装
cat /etc/shells
查看当前用户使用的
cat /etc/passwd | grep username
echo $SHELL
修改(重启生效)
chsh -s /bin/bash
临时修改
/bin/bash
/etc/profile:
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
.bash_profile
用户登录时执行。.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词
.bashrc
打开新shell执行,一般来说都会在.bash_profile里调用.bashrc脚本以便统一配置用户环境
环境变量设置
set
用来显示本地变量(当前shell变量)
env
用来显示环境变量(当前用户变量)
export
用来显示和设置环境变量(export 显示当前导出成用户变量的shell变量)
export命令:
用法: export #显示环境变量
#vi /etc/profile
export export MY_HOME="/HOME/PRM"#开机之后自动加载,对所有用户生效。
#vi /home/prm/.bashrc
export export MY_HOME="/HOME/PRM" #开机之后自动加载,对单个用户生效。
source命令:
功能: 使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
用法: source filename 或 . filename
source(.)filename 与 sh filename 及./filename 区别
1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。
2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句。(sh或./filename 都是子shell执行)
3.source filename:读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。
readonly
-f:定义只读函数
-a:定义只读数组变量
-p:显示系统中全部只读变量列表
readonly var="hello world"
unset $var 取消环境变量
declare/typeset
内建命令(这两个命令是完全一样的)允许指定变量的具体类型.declare命令是从Bash 2.0之后才被引入的命令. typeset也可以用在ksh的脚本中.
-u: 将一个变量的字符变成大写,typeset -u var="hello world"; echo ${var}# HELLO WORLD
-l: 将一个变量的字符变成小写,typeset -l var="HELLO WORLD"; echo ${var}# hello world
-r: 只读 declare -r var="read only"
-f: 在脚本中:declare -f 会列前面定义的所有函数。declare -f println 列出println函数
-a:declare -a array 变量array将被视为数组
-i: declare -i number 脚本将会把变量"number"按照整型进行处理.如果把一个变量指定为整型的话, 那么即使没有expr或者let命令, 也允许使用特定的算术运算.
vi命令
1)0: 移到行首; $:移到行尾部
2)gg:首行; nG:移到第几行; G:移到尾行
3) :set nu 设置行号 :set nonu 取消行号
4)x:删除字符; dw:删除当前单词; dd:删除当前行。
5)yy:复制当前行 p:粘贴到光标下一行 P:粘贴到光标前一行
6)u:撤销上一步
重定向
命令 含义 示例
cmand > ouputfile 将命令的输出发送到一个文件中date > filename
cmand >> ouputfile 追加到一个文件中date >> filename
cmand < ouputfile 将文件内容重定向到命令wc > filename
cmand << ouputfile 命令行指定输入重定向的数据wc << maker
>input every thing
>maker
端口占用
netstat –apn | grep 8080
linux 查看网卡 ifconfig -a
或者:/var/adm/autoinstall/scripts/eth_alias.sh
调试代码,下面的代码会输出冗余脚本,方便调试
set –x
script code
set +x
shell去掉首尾空格(trim)
result=`echo ${var} | sed 's/^ //' | sed 's/ $//'`