linux shell常用命令

来源:互联网 发布:锻炼思维能力的软件 编辑:程序博客网 时间:2024/05/17 04:13

个人工作中经常用到shell脚本,处理一些繁琐的事情,不算高深仅用于日常工作,基本可以满足。

一、shell 语法:

1、if控制语句结构
if [ ]; then   

elif [ ]; then

else

fi

比较数值类型
-lt  <     如:if [ "$a" -lt "$b" ]
-gt  >     如:if [ "$a" -gt "$b" ]
-le  <=    如:if [ "$a" -le "$b" ]
-ge  >=    如:if [ "$a" -ge "$b" ]
-eq  =     如:if [ "$a" -eq "$b" ]
-ne  !=    如:if [ "$a" -ne "$b" ]
比较字符串
"" = ""


逻辑运算符:
and or !
文件
-s 文件大小非空
-d 是目录
-f 是文件
-e 文件存在
if 使用的表达式


    Primary 意义
    [ -a 文件 ] 如果文件存在为真。
    [ -b 文件 ] 如果 文件 存在 而且 是一个 块-特殊 文件为真。
    [ -c 文件 ] 为真 如果 文件 存在 而且 是一个 字-特殊 文件。
    [ -d 文件 ] 为真 如果 文件 存在 而且 是一个 目录。
    [ -e 文件 ] 为真 如果 文件 存在。
    [ -f 文件 ] 为真 如果 文件 存在 而且 是一个 普通 文件。
    [ -g 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SGID 位。
    [ -h 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。
    [ -k 文件 ] 为真 如果 文件 存在 而且 他的粘住位已经设置。
    [ -p 文件 ] 为真 如果 文件 存在 而且 是一个 已经命名的管道 (F 如果O)。
    [ -r 文件 ] 为真 如果 文件 存在 而且 是可读的。
    [ -s 文件 ] 为真 如果 文件 存在 而且 比零字节大。
    [ -t FD ] 为真 如果 文件 文件描述符已经打开 而且 指向一个终端。
    [ -u 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SUID (set user ID)位。
    [ -w 文件 ] 为真 如果 文件 为真 如果 文件 存在 而且 是可写的。
    [ -x 文件 ] 为真 如果 文件 存在 而且 是可执行的。
    [ -O 文件 ] 为真 如果 文件 存在 而且 属于有效用户ID。
    [ -G 文件 ] 为真 如果 文件 存在 而且 属于有效组ID。
    [ -L 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。
    [ -N 文件 ] 为真 如果 文件 存在 而且 has been mod 如果ied since it was last read。
    [ -S 文件 ] 为真 如果 文件 存在 而且 是一个 socket。
    [ 文件1 -nt 文件2 ] 为真 如果 文件1 has been changed more recently than 文件2, or 如果
    文件1 存在 而且
    文件2 does not。
    [ 文件1 -ot 文件2 ] 为真 如果 文件1 比 文件2 旧, 或者 文件2 存在而且 文件1 不存在。
    [ 文件1 -ef 文件2 ] 为真 如果 文件1 而且 文件2 refer to the same device 而且 inode
    numbers。
    [ -o 选项名 ] 为真 如果 shell 选项 "选项名" 开启。
    [ -z STRING ] 为真 如果 "STRING"的长度是零。
    [ -n STRING ] 或者 [ STRING ] 为真 "STRING"的长度是非零值。
    [ STRING1 == STRING2 ] 如果两个字符串相等为真。 "=" may be used instead of "==" for
    strict POSIX compliance。
    [ STRING1 != STRING2 ] 为真 如果 两两个字符串不相等。
    [ STRING1 < STRING2 ] 为真 如果 "STRING1" sorts before "STRING2" lexicographically in the
    current locale。
    [ STRING1 > STRING2 ] 为真 如果 "STRING1" sorts after "STRING2" lexicographically in the
    current locale。
    [ ARG1 OP ARG2 ]
    "OP" 是 -eq, -ne, -lt, -le, -gt or -ge 其中一个。 These arithmetic binary operators
    return 为真 如果 "ARG1" is equal to, not equal to, less than, less than or equal to, greater
    than, or greater than or equal to "ARG2", respectively。 "ARG1" 而且 "ARG2" are
    integers。
    表达式可以借以下操作符组合起来, listed in decreasing order of precedence:


2、 sql:case   
when
when
end
shell: case  ${} in 
[Yy]) echo "a"
;;
[Nn]) echo "b"
;;
esac


3、循环
(1)while [ 循环条件 ] 
do
done 
 
(2)until [ 循环条件 ]
do
done
(3)for  var in 1 2 3 4 5 6
do
done
(4)跳出循环 break;
结束本次循环continue;
4、i="asdasd"  =号左右没有空格 赋值 弱类型语言,不需要指定类型(运行时自动)


5、函数function fun_name(参数...){
...
}
shell调用函数在必须定义之后。

6、对于异常处理来说没有类似 java等的try...catch 语法,一般来说是自己判断语句的执行成功与否 根据情况看书会否执行 exit num
$?返回之前一条命令执行的返回值,0为成功,非0为失败 
   $* 返回所有参数
   $# 是传给脚本的参数个数
        $0 是脚本本身的名字
        $1是传递给该shell脚本的第一个参数
        $2是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表




二、常用命令
0、man commod 查看系统自带的帮助文档
1、ls 目录下的文件(默认为当前目录)
2、ll 详细的ls
3、cp 复制文件  eg:
cp 源文件 目标文件  cp -r 源文件夹 目标文件夹
4、mv 重命名(剪切粘贴)eg:
mv 源文件 目标文件
5、mkidr 文件夹
6、rm  删除文件
7、cat (从上到下、从左到右)查看全部 输出到屏幕  正常读出   tac倒叙读出(从下到上)  rev(从右到左) 
8、more 部分显示使用度读大文件。
9、pwd 查看当前目录
10、vi文件编辑
/  向后查询   n下个   N上一个
? 向前查询 n下个   N上一个
:set nu 显示行号
:set nonu 隐藏行号
:set ic   忽略大小写 
:set noic 取消忽略大小写 
:a,b s/src/tag/[g]从第a行到第b行把src替换成tageg:1,$ s/NULL/1111/g   记住:^$的用法  行首、行尾
:wq  保存退出
:q!  强制退出
:$   行尾  shift+G行尾
:n   到第n行
键盘y+数字n+y:从当前行开始复制n行。 键盘p 粘贴到当前行的下一行
键盘d+数字n+d:从当前行开始剪切n行。 键盘p 粘贴到当前行的下一行
r 替换单个字符
s 将当前字符替换成字符串
x 剪切单个字符
a从当前字符的下个字符开始编辑
A从当前行尾开始编辑
i从当前字符的前个字符开始编辑
I从当前行尾开始编辑
 
11、find查找文件 
find /root/ -name "aa*" 
find /root/ -type f 
12 date    日期命令
(1)日期可以直接比较
(2)-d 获得指定字符串所代表的日期
可以进行日期的+ - 。   -d  中的+-  可以是 days weeks  months years
eg:date -d "2014-03-02 -1 days" +"%Y-%m-%d %H:%M:%S"
拿到月初date -d "2014-03-02"  +"%Y-%m-01"      
月末可以用月初减一
 
13、tar 打包
-v     输出到屏幕
-x      解压tar包
-c 创建tar包
-z 打gz文件
-j 打bz
                   
-zxvf  解压tar.gz
-zcvf打成tar.gz 
eg:   打包:tar -zcvf shell.tar.gz /path/
      解压: tar -zxvf shell.tar.gz  
 compress 压缩      .Z


14、ps -ef  查看进程。 第二列为进程号pid
15、kill命令杀掉进程。 kill -9 pid。  -9杀掉父进程
16、wc 查看行 单词 字符个数 eg: wc filename
 
17、grep 过滤文件
grep "AAA"  file 从文件file中过滤出包含AAA的行;
  -i  忽略大小写
  -v  取反的
  -E  "a|B"
  -l  显示出包含指定字符串的文件名

18、awk -F'split'  '{逻辑部分}' filename
awk 'BEGIN{初始化}{逻辑部分}END{结尾部分}' filename   BEGIN END部分只执行一遍 
(1) -F'split'   指定输入分隔符split  默认为空格
(2) 在BEGIN里面指定分隔符BEGIN{FS="split";OFS="\t"}
NR行号
NF列数
eg:awk 'BEGIN{print "title================"}{print NR,NF}END{print "=================="}' filename

19、sed 
-n   "1,9"p  file 1-9行内容
-i 在某行前一行插入  
-a 在某行后一行插入
  sed -i "3c 12312213213123 " a.sh 覆盖3行
 sed "s/src/tag/g" filename


20、sort 排序
eg:sort -t'\t' -k 1n -k 3r filename 
-t 指定分隔符
-k 指定某列排序
r降序
n指定数值
eg:sort -t''  -k 1 filename 


21 sort -u   去重整体去重(类似distinct)
uniq  去重  连续的去重 

22  join 关联可以连接 文件 
-t "split"  分隔符
-e "AAAA"  没匹配上,连接字段显示"AAAA"
-a1 以第一个文件为主,关联第二个文件。类似于sql中的left join
-a2 以第二个文件为主,关联第一个文件。类似于sql中的right join
-j1 1 -j2 1 以第一个文件的 第一列 和 第二个文件的第一列 进行关联。
-o 1.1,2.1  输出第一个文件的第一列 和第二个文件的 第二例。
注释:用join做关联的列必须进行排序。
做多列关联的时候 就适合用awk先拼接处一个新列在做关联。



三、联合处理
|  管道    将管道前命令的输出 作为 管道后命令的输入。
eg:   cat filename | wc 
xargs 一般跟管道连用,在管道前的输出过多时,分批处理,可按行处理具体参数(百度)。
>  file 重定向  如果file 不存在 则会创建文件;如果存在则会覆盖掉。 
>> file 重定向  如果file 不存在 则会创建文件;如果存在则会追加。
<  输入 相对应用较少。
<< 一般用作于交互式命令。暂记后续会有具体列子。
eg: ftp、mysql、hive、sqlplus等等。

tee file 与>类似 但是tee 会复制一份到屏幕显示。
-a    追加

对于文件的标准输入0 标准输出1 错误输出 2
eg:将一个命令的标准输出和错误输出合并 sh  commod.sh  2>&1 
是将错误输出重定向到标准输出中
||  连接命令  之前的命执行错误会执行。
&&  连接命令 之前的命令执行正确会执行。


四、常用其他命令。
chmod 授权命令    +r可读 +w可写 +x可执行 
4      2      1
chmod 777file
第一个7       第二个7第三个7
当前用户u 同组用户g其他用户o所有用户a
注释:sh脚本无执行权限用这个授予权限。

chown 改变用户组  -R  用户:组  文件  级联 具体用到再查
eg:   chown -R user:group filename

crontab  定时任务调度
-l 查看
-e 修改 编辑类似vi
语法  * * * * *  commod 分 时 月 日 星期
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令 
*/30每30分钟
7-23 7点到23点
1,4,5 1点4点5点

ftp ip  文件传输协议 
ftp连接到 ip。
内部命令
user   username  passwd
lcd    本地改变目录
cd ftp 服务器改变目录
pwd 查看ftp服务上的目录
bin 转化为二进制模式传输 规避乱码。
ascii ascii模式传输
get 获得文件至本地(似乎可两个参数,第二个参数重命名)   lcd的目录
put   上传文件
delete 删除
mget 批量获取 + 通配符
mput 批量上传 + 通配符
mdelete 批量删除 +通配符
脚本中:eg
ftp   192.168.1.1 <<FTP
user  username passwd
bin
lcd
cd
get filename
bye
<<FTP

su  本机切换用户  su - test  "-"不可缺少,同时切换环境变量
eg:su -l user -c  "commod" 不一定正确,大概印象中是,在当前用户下使用user的环境执行命令

ssh 登录远程主机软件(xshell、secureCRT等等)
ssh   username@192.168.1.1  
会要求密码。

scp 跨服务器 拷备份文件
scp root@ip:/path   本地目录 
或者
scp 本地目录    root@ip:/path   
均会要求密码(更深入的是可配置免密码登录不做深入)
0 0
原创粉丝点击