晦涩难懂的shell命令
Posted Tracy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了晦涩难懂的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#
后续更新,敬请期待。。。
如果文章对你哪怕有一点点的帮助,麻烦点个推荐或者关注,支持一下创作者!万分感谢!
以上是关于晦涩难懂的shell命令的主要内容,如果未能解决你的问题,请参考以下文章