您的位置:首页 > 运维架构 > Shell

shell常用命令

2016-05-22 15:44 176 查看
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@company.com" -c "copy@company.com" -b "blind@company.com" "to@company.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 -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来实现

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 + 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

输出:-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: