shell常用命令

来源:互联网 发布:什么软件基于位图软件 编辑:程序博客网 时间:2024/06/05 13:22
find
-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
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 : 扩展的正则(ps -ef | grep -E 'ycq|CMD')
  --text 


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,并且不需要输入密码,
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@huawei.com" -c "copy@huawei.com" -b "blind@huawei.com" "to@huawei.com" 
多个人之间用逗号分隔。
-s: 指定主题
-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 -sm *


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# 1235cut会先把-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来实现
tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"]
-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  :以那个区间 (field) 来进行排序的意思


uniq
命令可以去除排序过的文件中的重复行,uniq经常和sort合用。为了使uniq起作用,所有的重复行必须是相邻的。
-i: 忽略大小写字符的不同;
-c: 进行计数
-u: 只显示唯一的行# cat file | uniq -uc
-d: 只输出重复行,且只输出一次。# cat file | uniq -dc


date
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 选项 用户名
passwd llj


userdel
userdel 选项 用户名
-r  删除用户登入目录以及目录中所有文件
userdel -r llj


basename获取文件名部分
文件:带路径信息的文件
后缀:可选参数,指定要去除的文件后缀字符串
file=/home/prm/shell/start.sh
file2=`basename $file .sh`.txt


echo $file2    #start.txt


dirname 获取文件的目录部分
echo `dirname /home/prm/shell/start.sh`#/home/prm/shell


watch 周期性执行给定的指令
-n指定指令执行的间隔时间(秒)
-d 高亮显示指令输出信息不同之处
-t 不显示标题
每隔一秒显示系统时间:watch -n 1 -d date


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
1.Length
${#file} # 34
2.Substring
${file:0:16} # /mds/app/vds/wbp
${file:21} # start_onip.sh
3.Replace
${file/a/A} # /mds/App/vds/wbp/bin/start_onip.sh
${file//a/A} # /mds/App/vds/wbp/bin/stArt_onip.sh
4.Truncate
${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 + 1var2=`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,各处需要空格
$[]expr var =$[ $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
输出:-a -b paramb -c -d -- parama 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#显示环境变量
export MY_HOME="/HOME/PRM"  #设置环境变量,把这个变量载入到内存中,而并没有写入哪个文件,没有写入到磁盘上,而注销或重启之后,将失效。


#vi /etc/profile
export  export MY_HOME="/HOME/PRM" #开机之后自动加载,对所有用户生效。


#vi /home/prm/.bashrc
export  export MY_HOME="/HOME/PRM" #开机之后自动加载,对单个用户生效。

source命令:
介绍:source命令也称为"点命令",也就是一个点符号(.),是bash的内部命令。
功能:使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/ $//'` 


清空文件,/dev/null 是个"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到
cat /dev/null > file


crontab log:
cat /var/log/cron | grep "/home/prm/shell/start" |  tail -8


根据Excel生成sql 


将语句贴到空白列,然后复制,在粘贴到ultraedit,把多余的双引号替换掉。


普通版:
="prompt this is row "&ROW()&CHAR(10)&"insert into cdr_inter_201510 values('"&A2&"','"&B2&"','"&C2&"','"&D2&"','"&E2&"','"&F2&"','"&G2&"','"&H2&"','"&I2&"','"&J2&"','"&K2&"','"&L2&"','"&M2&"','"&N2&"','"&O2&"','"&P2&"','"&Q2&"','"&R2&"','"&S2&"','"&T2&"','"&U2&"','"&V2&"','"&W2&"','"&X2&"','"&Y2&"','"&Z2&"');"&CHAR(10)


去首尾空格:
="prompt this is row "&ROW()&CHAR(10)&"insert into cdr_inter_201510 values('"&TRIM(A2)&"','"&TRIM(B2)&"','"&TRIM(C2)&"','"&TRIM(D2)&"','"&TRIM(E2)&"','"&TRIM(F2)&"','"&TRIM(G2)&"','"&TRIM(H2)&"','"&TRIM(I2)&"','"&TRIM(J2)&"','"&TRIM(K2)&"','"&TRIM(L2)&"','"&TRIM(M2)&"','"&TRIM(N2)&"','"&TRIM(O2)&"','"&TRIM(P2)&"','"&TRIM(Q2)&"','"&TRIM(R2)&"','"&TRIM(S2)&"','"&TRIM(T2)&"','"&TRIM(U2)&"','"&TRIM(V2)&"','"&TRIM(W2)&"','"&TRIM(X2)&"','"&TRIM(Y2)&"','"&TRIM(Z2)&"');"&CHAR(10)


含有日期列:
="prompt this is row "&ROW()&CHAR(10)&"insert into cdr_inter_201510 values('"&TRIM(A2)&"','"&TRIM(B2)&"','"&TRIM(C2)&"',to_date('"&TEXT(TRIM(D2),"yyyy/mm/dd")&"','yyyy/mm/dd'),'"&TRIM(E2)&"','"&TRIM(F2)&"','"&TRIM(G2)&"','"&TRIM(H2)&"','"&TRIM(I2)&"','"&TRIM(J2)&"','"&TRIM(K2)&"','"&TRIM(L2)&"','"&TRIM(M2)&"','"&TRIM(N2)&"','"&TRIM(O2)&"','"&TRIM(P2)&"','"&TRIM(Q2)&"','"&TRIM(R2)&"','"&TRIM(S2)&"','"&TRIM(T2)&"','"&TRIM(U2)&"','"&TRIM(V2)&"','"&TRIM(W2)&"','"&TRIM(X2)&"','"&TRIM(Y2)&"','"&TRIM(Z2)&"');"&CHAR(10)


shell 登陆 oracle
sqlplus -S "${_USERNAME}/${_PASSWORD}@${_IP}/${_SID}" 2>&1 << EOF
   ${sql} 
EOF
或者 sqlplus username/password@dbstring
    @filename.sql


 shell调用oracle
/home/prm > sqlplus prm/prm_1234@ppdmed
SQL>@sql_file
1 0