Shell命令梳理

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/ $//'`




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FrancisBingo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值