当前位置: 首页 > news >正文

晦涩难懂的shell命令

  初学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#

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

 

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

转载于:https://www.cnblogs.com/lj-cn/p/7277420.html

相关文章:

  • 虚拟防火墙方案
  • 在Android中自定义IOS风格的按钮
  • mysql批量删除相同前缀的表格
  • C++笔试题
  • 服务器大量的fin_wait1 状态长时间存在原因分析-1
  • java中常见的异常类
  • MS Word 组件Spire.Doc V6.0.5发布 | 修复了rtf 到pdf 的转换问题
  • STM32中断优先级和开关总中断
  • 联想ThinkPad五大系列全介绍(转)
  • 新手学习Python时常见的错误
  • 为什么说JAVA的运行与计算机硬件平台无关?
  • java的static块及相关内容
  • netapp学习(十四)--WAFL特性
  • ORACLE RAC原理
  • 3d角色模型 制作 全过程 。3d max 。3d role model making process.3d Max
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 《剑指offer》分解让复杂问题更简单
  • Golang-长连接-状态推送
  • If…else
  • JavaScript DOM 10 - 滚动
  • java正则表式的使用
  • React16时代,该用什么姿势写 React ?
  • Spring Cloud中负载均衡器概览
  • Spring核心 Bean的高级装配
  • Sublime text 3 3103 注册码
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 构造函数(constructor)与原型链(prototype)关系
  • 猴子数据域名防封接口降低小说被封的风险
  • 我有几个粽子,和一个故事
  • 一、python与pycharm的安装
  • raise 与 raise ... from 的区别
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​如何防止网络攻击?
  • #考研#计算机文化知识1(局域网及网络互联)
  • #数学建模# 线性规划问题的Matlab求解
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (4.10~4.16)
  • (C++20) consteval立即函数
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (论文阅读11/100)Fast R-CNN
  • (转)平衡树
  • ***通过什么方式***网吧
  • .Net IOC框架入门之一 Unity
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .NET中两种OCR方式对比
  • .sdf和.msp文件读取
  • /3GB和/USERVA开关