shell及脚本2——shell 环境及命令
一.快捷键、通配符、特殊符号
1. 快捷键
CTRL+C:终止目前的命令
CTRL+D:输入结束,EOF
CTRL+M:ENTER
CTRL+S:暂停屏幕输出
CTRL+Q:恢复屏幕输出
CTRL+U:将整行命令删除
CTRL+Z:暂停目前的命令
2.通配符
* 任意多个字符
? 任意1个字符
[] 1个括号中的字符,例如[abcd]表示a/b/c/d中的任意1个
[-] 在编码顺序内的所有字符,例如[0-9]表示0,1,2,3,4,5,6,7,8,9所有这些数
[^] 反向选择,[^abc]表示只要不是a/b/c的字符
3.特殊符号
# 注释
\ 转移符
| 管道,分隔两个管道命令
; 连续命令分隔
~ 用户主文件夹 home/username
$ 变量前导符,使用变量时需要添加
& 后台工作
! 非
/ 目录
>,>> 数据流重定向,输出, >替换,>>累加
<,<< 数据流重定向,输入
' ' 单引号内的特殊符号失去特殊意义
" " 双引号内的特殊符号保留特殊意义
·· 反向单引号,可以执行命令
() 括号内为子shell
{} 命令块组合
二、数据流重定向
标准输出stdout:命令执行正确,输出的信息,一般默认为屏幕,代码为1,使用>或>>
错误输出stderr:命令执行错误,输出的信息,一般默认为屏幕,代码为2,使用2>或2>>
标准输入stdin:代码为0,使用<或<<
@ubuntu:~/test$ ls ./no_dir
ls: cannot access ./no_dir: No such file or directory
@ubuntu:~/test$ ls ./no_dir >ls_err // standard err 信息重定位到文件ls_err中,屏幕不再显示
@ubuntu:~/test$ cat ls_err // ls_err文件中保存了刚才的standard err信息
ls: cannot access ./no_dir: No such file or directory
@ubuntu:~/test$ ls ./no_dir >>ls_err // >>累加
@ubuntu:~/test$ cat ls_err
ls: cannot access ./no_dir: No such file or directory
ls: cannot access ./no_dir: No such file or directory
@ubuntu:~/test$ ls ./no_dir > /dev/null // /dev/null垃圾桶,能吃掉任何导入到此设备的信息
特殊需求:把stdout和stderr都输出到同一文件中
>out_file >out_file // 不对,stdout和stderr同时输出,out_file可能顺序混乱
>out_file 2>&1 // 正确, &1很关键,&表示1不是文件,而是stdou
三 命令执行顺序
cmd1 ; cmd2 // com1和com2顺序执行,没有条件
cmd1 && cmd2 // if(cmd1正确) cmd2
cmd1 || cmd2 // if(cmd1不正确) cmd2
&&和||的组合,一般遵循 cmd1 && cmd2 || cmd3, cmd1可能成功或失败,cmd2和cmd3一般都是成功的
*@ubuntu:~/test$ ls no_dir && echo "exist" || echo "not exit"
ls: cannot access no_dir: No such file or directory
not exit
*@ubuntu:~/test$ ls no_dir || echo "not exist" && echo "exit" // 与预期不符合,cmd2执行成功,cmd3也执行了
ls: cannot access no_dir: No such file or directory
not exist
exit
四 管道及管道命令
1.管道

前一个命令的stdout作为后一个命令的stdin,不是所有命令都能接收前一个命令的数据,例如ls,cp等就不行。
~$ ls /etc | less // ls /etc的stdout是一堆文件,这些信息作为less的stdin
2.选取命令:cut,grep
(1)cut:从一行数据中切出某一段
cut -d '分割字符' -f fields // 用-d后面的分隔符把一段信息分割成几段,然后用-f取出第几段
cut -c 字符范围 // 以字符范围取出固定个字符
:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
:~$ echo $PATH | cut -c 5- #从第5个字符取到结尾
/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
:~$ echo $PATH | cut -c 5-10 #取字符5-10
/local
:~$ echo $PATH | cut -d ':' -f 3 #以:为分隔符,取第3段
/usr/sbin
(2)grep:分析一行数据,如果有我们所需要的信息,就将该行拿出来。
grep [-acinv] [--color=auto] '查找字符串' filename
-a:将binary文件以text文件的方式查找数据
-c:计算'查找字符串'的次数
-i:忽略大小写
-n:输出行号
-v:反向选择
--color=auto:关键字加颜色显示
:/$ ls -lh / | grep -n 'bin'
:drwxr-xr-x root root .0K 12月 : bin
:drwxr-xr-x root root 12K 12月 : sbin
3.排序命令:sort,wc,uniq
(1).sort:排序,依据不同的数据类型排序
sort [-fbMnrtuk] [file or stdin]
-f:忽略大小写
-b:忽略最前面的空格
-M:以月份的名字排序
-n:使用纯数字排序,默认是文字类型
-r:反向排序
-u:uniq,相同的数据,仅列出1行
-t:分隔符,默认tab
-k:以哪个区间进行排序,一般与-t连用
:/$ cat /etc/passwd | sort #首字符排序
_apt:x::::/nonexistent:/bin/false
avahi-autoipd:x:::Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:::Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
backup:x:::backup:/var/backups:/usr/sbin/nologin
bin:x:::bin:/bin:/usr/sbin/nologin
colord:x:::colord colour management daemon,,,:/var/lib/colord:/bin/false
......
liuwanpeng@liuwanpeng-virtual-machine:/$ cat /etc/passwd | sort -t ':' -k 3 #:分隔后的第三个段排序,默认字符
root:x:0::root:/root:/bin/bash
liuwanpeng:x:1000::liuwanpeng,,,:/home/liuwanpeng:/bin/bash
systemd-timesync:x:::systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:::systemd Network Management,,,:/run/systemd/netif:/bin/false
usbmux:x:::usbmux daemon,,,:/var/lib/usbmux:/bin/false
......
liuwanpeng@liuwanpeng-virtual-machine:/$ cat /etc/passwd | sort -t ':' -k -n #:分隔后的第三个段排序,按数字排序
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
bin:x:::bin:/bin:/usr/sbin/nologin
......
(2).wc:数数字,多少字,多少行,多少字符
wc [-lwm]
-l:列出行数
w:列出多少字(英文单子)
m:多少字符
:/$ cat /etc/passwd |wc
2545 #45行 74字数 2545字符
(3).uniq:重复的数据仅显示1个
uniq [-ic]
-i:忽略大小写
-c:进行计数
4.双向重定向:tee

同时向stdout和file中存放结果
tee [-a] file
-a:累加方式
:~$ ls / | tee ~/ls_result #在屏幕显示结果的同时,将结果存入文件ls_result中
5.字符转换命令:tr,col,join,paste,expand
(1).tr:删除或替换一段信息中的文字,!只能等字符替换
tr [-ds] SET1 [SET2]
-d:删除SET1字符串
-s:替换掉重复的字符
:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~$ echo $PATH | tr -d 'bin' #删除bin
/usr/local/s:/usr/local/:/usr/s:/usr/:/s:/:/usr/games:/usr/local/games:~$ echo $PATH | tr 'bin' 'bin_replace' #没达到效果,只能等字符替换
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~$ echo $PATH | tr 'bin' 'replace'
/usr/local/srep:/usr/local/rep:/usr/srep:/usr/rep:/srep:/rep:/usr/games:/usr/local/games:~$ echo $PATH | tr 'bin' 'nib'
/usr/local/snib:/usr/local/nib:/usr/snib:/usr/nib:/snib:/nib:/usr/games:/usr/local/games
(2).col:
col [-xb]
-x:将TAB键换成对等的空格键
-b:文字中有反斜杠/时,只保留反斜杠最后接的那个字符
(3).join:将两个文件有相同数据的那一行加在一起,处理两个相关文件时比较有用
jion [-ti12] field1 field2
-t:分隔符,默认为空格,且默认对比第1个字符
-i:忽略大小写
-1:要用第一个文件的哪个字段比对
-2:要用第二个文件的哪个字段对比
:~$ sudo head -n /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin
bin:x:::bin:/bin:/usr/sbin/nologin ==> /etc/shadow <==
root:!:::::::
daemon:*:::::::
bin:*:::::::
:~$ sudo join -t ':' - - /etc/passwd /etc/shadow
:root:x::root:/root:/bin/bash:root:!:::::: #第2个文件的第4个元素不显示了
:root:x::root:/root:/bin/bash:daemon:*::::::
:root:x::root:/root:/bin/bash:bin:*::::::
(4).paste:直接将两行粘贴到一起,中间用tab键隔开
paste [-d] file1 file2
-d:分隔符,默认是tab
-:如果file部分是-,表示标准输入stdin,可以理解成paste不能直接读取stdin,需要通过“-”把stdin转换成命令的输入文件
liuwanpeng@liuwanpeng-virtual-machine:~$ sudo paste /etc/passwd /etc/shadow | head -n
root:x:::root:/root:/bin/bash root:!:::::::
daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin daemon:*:::::::
bin:x:::bin:/bin:/usr/sbin/nologin bin:*::::::: liuwanpeng@liuwanpeng-virtual-machine:~$ sudo cat /etc/group |sudo paste /etc/passwd /etc/shadow - | head -n
root:x:::root:/root:/bin/bash root:!::::::: root:x::
daemon:x:::daemon:/usr/sbin:/usr/sbin/nologin daemon:*::::::: daemon:x::
bin:x:::bin:/bin:/usr/sbin/nologin bin:*::::::: bin:x::
(5).expand:将tab键转换成空格键
expand [-t] file
-t:默认tab=8空格,也可以在-t后面加数字自己设置空格的数量
6.切割命令:split
把大文件依据文件大小或行数切割成小文件
split [-bl] file PREFIX
-b:文件大小,单位可用b、k、m
-l:以行数切割
:/work/platform-zynq/linux-xlnx-repo-smp/arch/arm/boot$ split -b 1m uImage uImage #切割:/work/platform-zynq/linux-xlnx-repo-smp/arch/arm/boot$ cat uImagea* >> uImage_new #合成新文件
:/work/platform-zynq/linux-xlnx-repo-smp/arch/arm/boot$ ls -lh
总用量 20M-rw-rw-r-- liuwanpeng liuwanpeng 3.3M 12月 : uImage
-rw-rw-r-- liuwanpeng liuwanpeng 1.0M 12月 : uImageaa
-rw-rw-r-- liuwanpeng liuwanpeng 1.0M 12月 : uImageab
-rw-rw-r-- liuwanpeng liuwanpeng 1.0M 12月 : uImageac
-rw-rw-r-- liuwanpeng liuwanpeng 239K 12月 : uImagead
-rw-rw-r-- liuwanpeng liuwanpeng 3.3M 12月 : uImage_new #与uImage大小一样
7.参数代换:xargs
产生命令的参数,而不是产生命令的输入,用例子说明最明白
:~/test$ ls #两个文件
file1 file2
:~/test$ cat file1 file2 #两个文件的内容
this is file 1
this is file 2
:~/test$ find -name "*"
.
./file2
./file1
:~/test$ find -name "*" |grep 'file' #在find命令的stdout信息中找file,能找到
./file2
./file1
:~/test$ find -name "*" |grep 'this' #在find命令的stdout信息中找this,肯定内有,因为this在文件的内容里:~/test$ find -name "*" |xargs grep 'this’ #把find找到的两个文件作为参数传给grep,grep在这两个文件里找this,找到了
grep: .: 是一个目录
./file2:this is file
./file1:this is file 1
:~/test$ grep 'this' file1 file2 #使用xargs后相当于此命令
file1:this is file 1
file2:this is file 2
8.减号-的作用
替代stdout或者stdin
tar -cvf - /home | tar -xvf - #第一个减号,表示tar包不存到文件,而是存到stdout
#管道把第一个命令的stdout(tar包)转化为第二个命令的stdin
#第二个-号表示解压stdin
shell及脚本2——shell 环境及命令的更多相关文章
- shell及脚本4——shell script
一.格式 1.1 开头 必须以 "# !/bin/bash" 开头,告诉系统这是一个bash shell脚本.注意#与!中间有空格. 二.语法 2.1 数值运算 可以用decla ...
- Shell脚本字符串匹配及日常命令工具 - 用法总结(技巧指南)
Shell提供了很多字符串和文件处理的命令,如awk.expr.grep.sed等命令,还有文件的排序.合并和分割等一系列的操作命令.下面重点总结下Shell字符串处理.文本处理以及各类命令及函数用法 ...
- shell 编程 && bash 简介(shell 变量、shell操作环境、数据流重导向、管线命令、shell script)
如何学习一门编程语言 数据类型 运算符 关键字 1 认识BASH 这个shell linux是操作系统核心,用户通过shell与核心进行沟通,达到我们想要的目的.硬件.核心.用户之间的关系: 原理:所 ...
- Linux Shell脚本入门--cut命令
Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...
- shell脚本编程-使用结构化命令(if/else)(转)
11.1 使用if-then语句 格式如下 if语句会执行if行定义的那个命令,如果该命令的退出状态码是0,则then部分的语句就会执行,其他值,则不会 1 2 3 4 if command th ...
- shell脚本中判断上一个命令是否执行成功
shell脚本中判断上一个命令是否执行成功 shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败.结合if-else语句实现判断上一个命令是否执行成功. 示例 ...
- Linux Shell脚本入门--wget 命令用法详解
Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...
- linux shell 脚本攻略学习20--awk命令入门详解
awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...
- centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课
centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 ...
随机推荐
- 创建虚拟目录失败,必须为服务器名称指定“localhost”?看进来!!
没废话,直接讲! 关于微信开发过程,远程调试后,再次打开vs出现项目加载失败的解决办法! 上图: 这图应该不陌生,你肯定打开iis把绑定的域名给干掉了.这个提示很坑人,简直就是坑爹!!!fck!! 来 ...
- JAVA JSP笔记
一.jsp加载项目中资源图片 如果直接将静态页面写的代码copy到jsp中,你会发现图片都无法加载. 获取代码: String path = request.getContextPath(); Str ...
- MongoDB进行MapReduce的数据类型
有很长一段时间没更新博客了,因为最近都比较忙,今天算是有点空闲吧.本文主要是介绍MapReduce在MongoDB上的使用,它与sql的分组.聚集类似,也是先map分组,再用reduce统计,最后还可 ...
- Java编程里的类和对象
像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...
- j2ee log4j集中式日志解决方案logpool-v0.2
下一个小版本会进行清理. war包下载地址 http://pan.baidu.com/s/1nvGmORn
- tomcat项目中文乱码问题解决方法
在部署tomcat项目时经常会遇到中文乱码问题,解决的方法可参考以下步骤. 1.更改Tomcat安装目录下的conf\server.xml,指定浏览器的编码格式为"utf-8"格式 ...
- GCD的相关函数使用
GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...
- 搞不清FastCgi与PHP-fpm之间是个什么样的关系?
问 我在网上查fastcgi与php-fpm的关系,查了快一周了,基本看了个遍,真是众说纷纭,没一个权威性的定义. 网上有的说,fastcgi是一个协议,php-fpm实现了这个协议: 有的说,php ...
- 数据备份的OSS接口
最近在做一个新的项目,从RDS备份到OSS,进行数据备份以及后续的还原.这边对阿里云的OSS数据上传接口进行说明,先做下笔记先简单介绍下OSS: ①Object 在OSS中,用户操作的基本数据单元是O ...
- linux rsync配置文件参数详解
一.全局参数 在[moudle]之前的参数都是全局参数,也可以在全局参数下定义部分模块参数,这时该参数的值就是所有模块的默认值. port:指定后台程序使用的端口号,默认是873 logfile:指定 ...