当前位置: 首页 > 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
  • 收藏网友的 源程序下载网
  • 4个实用的微服务测试策略
  • Android交互
  • IP路由与转发
  • maya建模与骨骼动画快速实现人工鱼
  • Netty 4.1 源代码学习:线程模型
  • ReactNativeweexDeviceOne对比
  • Spring-boot 启动时碰到的错误
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue 配置sass、scss全局变量
  • webpack4 一点通
  • yii2权限控制rbac之rule详细讲解
  • 分类模型——Logistics Regression
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何设计一个微型分布式架构?
  • 我感觉这是史上最牛的防sql注入方法类
  • 说说我为什么看好Spring Cloud Alibaba
  • ​Java基础复习笔记 第16章:网络编程
  • ​比特币大跌的 2 个原因
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (黑马C++)L06 重载与继承
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)负载均衡,回话保持,cookie
  • (转)四层和七层负载均衡的区别
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net framework4与其client profile版本的区别
  • .Net Remoting常用部署结构
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET运行机制
  • @Documented注解的作用
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [APIO2012] 派遣 dispatching
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [flask]http请求//获取请求头信息+客户端信息
  • [go 反射] 进阶