初学shell脚本,过程中发现许多不易于理解的脚本语言,网上各种查找学习之后,择优精简一番,做出以下总结,方便以后遗忘了回顾,也为像我一样的初学者提供方便——推荐给初学者的一本书:《Linux Shell脚本攻略》【印】Sarath Lakshman,作者是印度人,对于shell命令的总结可谓是非常详尽。

1.  重定向符号

>               输出重定向到一个文件或设备 覆盖原来的文件
>!              输出重定向到一个文件或设备 强制覆盖原来的文件
>>             输出重定向到一个文件或设备 追加原来的文件
<               输入重定向到一个程序

2.  标准错误重定向符号

2>             将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件
2>>           将一个标准错误输出重定向到一个文件或设备 追加到原来的文件
2>&1         将一个标准错误输出重定向到标准输出 注释:1 可能就是代表 标准输出
>&             将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件  c-shell
|&              将一个标准错误 管道 输送 到另一个命令作为输入

3.  shell中的与(&&)和或(||)

如果第一个命令执行成功,与操作符 (&&)才会执行它之后的第二个命令
如果第一个命令执行失败,或操作符 (||)才会执行它之后的第二个命令

4.  用find命令查找指定目录下文件名中含关键字“xxx”的文件(递归查找)
find /指定目录 -name '*关键字*'

5.  文件夹处理:
cp(复制)命令:cp -r /demo/em1 /demo/em2/em2a
注:某文件夹下的文件复制到该文件夹下的其他文件夹“  cp 文件 /该文件夹/文件夹a  ”,不需要-r,复制文件夹到电脑其他地方文件夹前要加/,系统才能识别该文件夹,否则会提示错误.
mv(移动)命令:mv /demo/em1 /demo/em2
注:将某文件夹移动到其他文件夹里,要确保同级目录下不能有与其文件夹名一样的文件夹

6.  shell中$1~$n

指添加到shell脚本中的各参数值,$1是第1参数,意为从外面传一个参数给$1,2是第2参数

7.  echo -e和read -p

同样都有输出指定内容的功能,但read -p后输出的内容将全部显示在终端显示器上,而echo -e后则可添加其他命令,比如换行符和内容显示颜色等等

输入命令:read -p "\nHello World" x

输出结果:\nHello World

输入命令:echo -e "\nHello World"

     read x

输出命令:      ←此为换行符效果

     Hello World

8.  test ! -d $dir  

test -d $dir     意为:如果文件$dir为一个目录,则为真

test ! -d $dir  意为:判断文件$dir不是一个目录,则为真,命令执行成功

9.  ls -R /root

递归查看路径root下的所有目录

10.     2> /dev/null

将标准错误输出重定向到空设备,即不把输出内容显示到终端显示器上

11.  grep -v '^$'    过滤(删除)空白符  grep -v反转查找

   grep -v -n '^$'    过滤(删除)空行   ^代表行首  $代表行尾

12.  sed 's/:.*$//g'    替换文本中的:.内容

举例说明:如果要查找某个文档里包含关键字option的位置,如果文档中有op:tion的内容,则无法被查出来,所以要替换掉字符或者空白符

sed更多命令请转至http://man.linuxde.net/sed详细查看

图片引自https://www.zybang.com/question/6c3d3623380bd3fa47d0363c76f6e85c.html,侵权请联系笔者删除

13.  管线命令 |

[test @test bin]# last | grep root | wc -l
这个管线命令仅能处理经由前面一个指令传来的正确信息,也就是standard output ( STDOUT ) 的信息,对于 stdandard error 并没有直接处理的能力

14.  cd进不去主文件夹问题的解决办法:文件目录加单引号

     cd  '/Download/localhost'

15.  在终端写入文本内容
cat <<EOF>log.txt
LOG FILE HEADER
This is a test log file
Function: System statistics
EOF
   在cat <<EOF>log.txt与下一个EOF行之间的所有文本行都会被当做stdin数据

16.  为读取文件创建一个文件描述符:
exec 3<input.txt  
使用文件描述符3打开并读取文件 我们可以这样使用它:
echo this is a test line > input.txt
exec 3<input.txt
现在你就可以在命令中使用文件描述符3了。例如:
cat <&3 this is a test line
如果要再次读取,我们就不能再继续使用文件描述符3了,而是需要用exec重新分配文件描述符3以便用于读取。

17.  定义一个普通数组: array_var=(1 2 3 4 5)#这些值将会被存储在以0为起始索引的连续位置上
将数组定义成一组索引: array_var[0]="test1" array_var[0]="test2" ...
定义一个关联数组:(在关联数组中,我们可以用任意的文本作为数组索引。而在普通数组中,只能用整数作为数组索引)
先声明:declare -A ass_array
再定义:ass_array=([index1]=var1 [index2]=var2)
列出数组索引:echo ${!array_var[*]}

18.  转义字符\的特殊作用:

在不信任的环境下执行特权命令,通过在命令前加上 \ 来忽略可能存在的别名设置总是一个不错的安全实践。因为攻击者可能已经利用别名将某些特权命令替换成了一些别有用心的命令,借此来盗取用户输入的重要信息。

19.  任务前后台切换:
1、command &  将任务切至后台,同时得到后台任务号和任务ID
2、执行一个任务,Ctrl z 用来挂起任务,此时可以用'bg 任务号'来将任务切至后台,用'fg 任务号'来将任务切至前台

20.  定义一个新命令,用来结合其它几个命令(举个栗子):

                  方法一、cmd=$(ls|cat -n)
        用反引号" ` "存储命令输出—>    方法二、cmd=`ls|cat -n`

21.  括号()的特殊用法:

终端输入(命令):命令在子shell中执行时,不会影响当前shell的执行
举个栗子: pwd;(cd /bin;ls);pwd    #pwd 显示当前所在目录
扩展:可以通过子shell的方式保留空格和换行符

22.  不显示输入密码

#!/bin/sh
#Filename: password.sh
echo -e "Enter password: "
stty -echo
read password
echo $password
#stty echo
#read password
#echo $password
其中,选项-echo禁止将输出发送到终端,而选项echo则允许发送输出。

23.  将多行文本内容输出为一行:

     1、 cat example.txt(内含多行文本内容) | xargs
   用xargs还可将单行转为多行:cat example.txt | xargs -n 3 (3个字符为一行)
             2、 echo $(example.txt)

23.  xargs -d

echo "splitXsplitXsplitXsplit" | xargs -d X
split split split split
在上面的代码中,stdin是一个包含了多个X字符的字符串。我们可以用 -d将X作为输入定界符。在这里,我们明确指定X作为输入定界符,而在默认情况下,xargs采用内部字段分隔符(IFS)作为输入定界符。 同时结合-n,我们可以将输入划分成多行,而每行包含两个参数:
echo "splitXsplitXsplitXsplit" | xargs -d X -n 2
split split
split split

24.  删除所有的.txt文件
find . -type f -name "*.txt" -print0 | xargs -0 rm -f
xargs -0将\0作为输入定界符。

25.  统计源代码目录中所有C程序文件的行数
find source_code_dir_path -type f -name "*.c" -print0 | xargs -0 wc -l

26.  删除除指定内容外的其它内容(即删除指定内容的补集)
echo you 1 me 2 xiaoshagua 6|tr -d -c '0-9\n'

1 2 6

27.  求给出文档中的所有数字的和:

cat sum.txt | echo [ (tr '\n' '+' ) 0 ]

28.  将文件名从小写换为大写输出在终端上
ls|tr [:lower:] [:upper:]

29.  sort -k 1.3,1.3 -rk 3,3 a3.txt

按照每行的第三个字符开始排序,并结束于每行的第三个字符,同时逆序排序第三个域(即每行被空格分开的第三部分)

30.  sort a3.txt|uniq -s 2 -w 2

跳过前两个字符,并忽略第二个字符之后的内容
例:i am a good man
       i love you
输出:iam a good man    按排序顺序输出,由于跳过前两个字符,并忽略第二个字符之后的内容,所以两行内容相等,输出排序在前的

31.  查找每个字符出现的次数

input="ahebhaaa"
output=`echo $input | sed 's/[^\n]/ & \n/g' | sed '/^$ /d' | sort | uniq -c | tr -d '\n'`
echo $output

32.  /tmp目录下创建临时文件名:

1、temp_file=$(tempfile)    2、temp_file="/tmp/file-$RANDOM"    3、temp_file="/tmp/var.$$"

33.  生成一个大小为100KB的测试文件(data.file):
dd if=/dev/zero bs=100k count=1 of=data.file
     将文件分割成多个更小的文件:
split -b 10k data.file

34.  csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log";rm server00.log
□ /SERVER/ 用来匹配某一行,分割过程即从此处开始。
□ /[REGEX]/ 表示文本样式。包括从当前行(第一行)直到(但不包括)包含“SERVER”的匹配行。
□ {*} 表示根据匹配重复执行分割,直到文件末尾为止。可以用{整数}的形式来指定分割执行的次数。
□ -s 使命令进入静默模式,不打印其他信息。
□ -n 指定分割后的文件名后缀的数字个数,例如01、02、03等。
□ -f 指定分割后的文件名前缀(在上面的例子中,server就是前缀)。
□ -b 指定后缀格式。例如“% 02d.log”,类似于C语言中printf的参数格式。在这里文件名=前缀+后缀=server + %02d.log。
因为分割后的第一个文件没有任何内容(匹配的单词就位于文件的第一行中),所以我们删除了server00.log。

35.  拆分形如"sample.jpg"格式的文件名和扩展名:

file_jpg="sample.jpg"

name= {file_jpg%.*}

extension={file_jpg#*.}  此处最好用##*.

%.* 得到文件名          #*. 得到扩展名

36.  给文本内容每行末尾加一个定界符#

pass.sh
echo $*'#'
localhost@ubuntu:~/shell$ cat tess.txt | xargs -I {} ./pass.sh -p {} -I    #注意xargs -I是-I(i),不是-l(L),后面-I可以是随意的一个字母
-p tes1 -I#
-p tes2 -I#
-p tes3 -I#

后续更新,敬请期待。。。

如果文章对你哪怕有一点点的帮助,麻烦点个推荐或者关注,支持一下创作者!万分感谢!

晦涩难懂的shell命令的更多相关文章

  1. 教妹学 Java:晦涩难懂的泛型

    00.故事的起源 “二哥,要不我上大学的时候也学习编程吧?”有一天,三妹突发奇想地问我. “你确定要做一名程序媛吗?” “我觉得女生做程序员,有着天大的优势,尤其是我这种长相甜美的.”三妹开始认真了起 ...

  2. Hadoop Shell命令大全

    hadoop支持命令行操作HDFS文件系统,并且支持shell-like命令与HDFS文件系统交互,对于大多数程序猿/媛来说,shell-like命令行操作都是比较熟悉的,其实这也是Hadoop的极大 ...

  3. Shell命令和流程控制

    Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字 ...

  4. 在程序中执行shell命令

    在linux系统下的操作中我们会经常用到shell命令来进行,一开始学习进程的时候对于shell命令也进行了思考,认为shell命令就是一个进程的外壳,经过了后来的学习对于这一点也有了更多的认识. 用 ...

  5. Linux远程执行Shell命令或脚本

    ## 远程执行shell命令 ssh [user]@[server] '[command]' # eg. ssh root@192.168.1.1 'uptime' ## 远程执行本地shell脚本 ...

  6. HBase基本shell命令

    HBase基本shell命令 以下shell命令都是经过测试,正常展示,若有不足,还望指点! 1.创建表 create ‘表名称’,‘列族名称1’,‘列族名称1’create 'test_M_01', ...

  7. Linux SHELL 命令入门题目答案(一)

    1.如何使用shell 打印 “Hello World!” (1)如果你希望打印 !,那就不要将其放入双引号中,或者你可以通过转义字符转义(2)echo 'hello world!' 使用单引号ech ...

  8. Linux SHELL 命令入门题目(一)

    新年新气象,注重知识积累,提高手敲代码能力,而不是眼高手低,只会复制黏贴. 1.使用shell 打印 “Hello World!” 2.求变量'hello world'的字符长度 3.$0 .$SHE ...

  9. shell命令获取最新文件的名称

    最近有一个需求,在部署游戏战场服时,从程序包到部署需要做一些本地化的操作,手工操作费时费力,故写一个shell脚本,一键部署. 遇到的问题是每次要部署最新的程序包,因此需要shell命令获取最新的文件 ...

随机推荐

  1. xcode编译提示Permission denied

    编译第三方XCode插件时,提示没有文件操作权限(Permission denied) 使用命令行,修改Xcode目录当前用户操作权限: sudo chmod -R 777 /Users/当前的用户名 ...

  2. jQuery的过滤器总结

    1.内容过滤器 $(function () { // $("a:contains('标签')").css("color","green") ...

  3. 3-java_string学习笔记:

    java中String的常用方法

  4. golang语言基础(一)

    0.项目的组织结构: GOPATH路径下是src文件夹---->src文件夹下是项目名称---->项目名称下是该项目的各个包名---->各包名下是.go文件(一个包下,无论有多少个. ...

  5. Halcon阈值化算子dual_threshold和var_threshold的理解

    Halcon中阈值二值化的算子众多,通常用得最多的有threshold.binary_threshold.dyn_threshold等. threshold是最简单的阈值分割算子,理解最为简单:bin ...

  6. Java程序设计17——多线程-Part-C

    11 使用管道流 前面介绍的两种方式与其称为线程之间的通信,还不如称为线程之间协调运行的控制策略.如果需要在两条线程之间进行更多的信息交互,则可以考虑使用管道流进行通信. 管道流有3中存在形式:Pip ...

  7. Nginx搭建成功后,无法访问Tomcat问题

    一.nginx搭建好后无法访问后端Tomcat项目 通过项目名称过滤的方式访问Tomcat,比如项目名称叫easy. 修改其server下的location目录,配置如下: server { #监听的 ...

  8. 超级详细的解决方法 (CentOS7) :永久修改 mysql read-only 问题 could not retrieve transation read-only status server

    一.查看mysql的事物隔离级别 SHOW VARIABLES LIKE '%iso%'; 二.临时修改事物隔离级别 SET GLOBAL tx_isolation='READ-COMMITTED'; ...

  9. python使用git进行版本控制-分支管理

    1.远程克隆 最好的方式是先创建远程库,然后,从远程库克隆: 首先在github上创建一个新的仓库,名字叫gitskills 我们勾选Initialize this repository with a ...

  10. util:properties

    示例 <util:properties id="db" location="classpath:db.properties" /> 全部属性 功能概 ...