文章目录
如何生成一串整数数列
seq 1,10
比如:
[root@web-test-1-tuedh tmp]# seq -s , 2 6
2,3,4,5,6
如何循环
[root@web-test-1-tuedh tmp]# for i in $(seq 1 10);do echo aaa ${i};done
aaa 1
aaa 2
aaa 3
aaa 4
如何拼接字符串
shell 没啥拼接字符串的语法…变量放一起就是拼接了…
[root@web-test-1-tuedh tmp]# i=a;j=a;echo $i$j;
aa
如何快速清空一个目录下的所有文件内容,而不删除
for i in `ll | awk '{print $9}'`;do cat /dev/null > $i;done
如何找到大文件
find / -type f -size +500M -print0|xargs -0 ls -lh
如何对找到的一堆文件做操作
# 找到文件之后再展示出来
find ./ -name "*.out" -exec ls {} \;
# 找到文件之后再清空内容,但是不删除内容
find ./ -name "*.out" -exec cp /dev/null {} \;
# 还有一种更骚的手段
find . -name "terraco*" -mtime -16 -mtime +11 |awk '{print "echo > "$0}'|bash
awk '{print "echo > "$0} 用于组装打印命令,然后传给bash来执行
-mtime -16 -mtime +11 指匹配出日期时间再11-16天之内的
# 删除 14天之前的文件
find . -type f -mtime +14 -exec rm {} \;
注意一定不要忘记 {} \;
exec
xargs
用途
-exec
参数后面跟的是command
命令,它的终止是以;
为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。{}
花括号代表前面find查找出来的文件名
配合使用find
时,只要把想要的操作写在一个文件里,就可以用exec
来配合find
查找,很方便的。在有些操作系统中只允许-exec
选项执行诸如l s
或ls -l
这样的命令
可参见上一节的具体例子, 这简直就是个神器.
strings ()
常用来在二进制文件中查找字符串,与grep配合使用。strings命令输出的字符串长度为4个或4个以上的,长度小于4的字符串将不予打印,我们可以通过-n参数调整:
strings -n 2 filename
还有一个更典型的场景,查看某个进程使用的环境变量
strings /proc/[pid]environ/
; 如果是使用 cat 打开,会发现环境变量都坨在一起了
let
执行算数运算和数值表达式运算,但其实不如使用 ((expression))
这样的更方便
比如:
i=0;
((i+=10));
echo ${i}
echo $(($i*10))
数据流重定向
首先要知道一点:
输入、输出的说法是针对 命令 的,不是对后面操作的内容,比如文件的。
-
标准输入
<
或<<
, 也写作0<
或0<<
,数据流从右向左 -
标准输出
>
或>>
,也写作1<
或1<<
, 数据流从左向右比如:
> a.txt
直接清空了内容 -
错误输出
2>
或 错误追加2 >>
e.g.
find /home/ -name .bashrc > /tmp/1.txt 2>> /tmp/2.txt
将标准输出输出到 1.txt ; 错误输出输出到 2.txt
e.g.
echo 'spring' > a.txt 2>> a_error.txt
这是个错误命令,错误信息会输出到 a_error.txt 里;实际使用时,多将正确、错误的信息都输出到同一个文件中echo 'spring' > a.txt 2>> a.txt
这相当于:
echo 'spring' > a.txt 2>&1
(推荐)还有更常用的简略的命令:
echo 'spirng' >& huting.txt
其实,这
>&
是一种简约的写法,繁点的是2>&1
e.g.
cat >>huting.txt<<EOF 12 123 EOF
实现多行文本追加写cat >huting.txt<<EOF content EOF
实现多行文本覆盖写e.g.
> huting.txt
相当于将文本中的内容直接清空了
cat > a.txt
按ctrl d
离开
点击【这里】,有一篇很不错的文章介绍
如何对文本排序/合并排序/指定关键字排序 sort
如果有一个文件的内容是这样:
[root@my programming]$ cat facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。
那么我想以水果数量来排序,也就是以第二列来排序,如何利用`sort``实现?
幸好,sort
提供了-t
选项,后面可以设定间隔符。(是不是想起了cut
和paste
的-d
选项)
指定了间隔符之后,就可以用-k
来指定列数了。
[root@my programming]$ sort -n -k 2 -t : facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3
另外:
-n
按数值而不是字符排序-r
逆排序
如果是要合并文件排序:
cat log1 log2 | sort -t ' ' -k1 -k2
【重要!】如何对文件的行进行排序并统计重复次数
cat a.txt |sort |uniq -c |sort -rn | tee c.txt
- uniq -c : count
- uniq -d : only print duplicate lines, one for each group
- uniq -f : avoid comparing the first N fields
- uniq -i : ignore differences in case when comparing
- uniq -u : only print unique lines
如何逐行合并2个文件中行的内容
paste a.txt b.txt c.txt
使用 join 基于一个共同字段合并多个文件的内容
合并文件的另一个命令是 join。join 命令让你能基于一个共同字段合并多个文件的内容。例如,你可能有一个包含一组同事的电话的文件,其中,而另一个包含了同事的电子邮件地址,并且两者均按个人姓名列出。你可以使用 join 创建一个包含电话和电子邮件地址的文件。(窃以为和 vlookup
类似)
一个重要的限制是文件的行必须是相同的顺序,并在每个文件中包括用于连接的字段。
这是一个示例命令:
$ join phone_numbers email_addresses
Sandra 555-456-1234 bugfarm@gmail.com
Pedro 555-540-5405
John 555-333-1234 john_doe@gmail.com
Nemo 555-123-4567 cutie@fish.com
在本例中,即使缺少附加信息,第一个字段(名字)也必须存在于每个文件中,否则命令会因错误而失败。对内容进行排序有帮助,而且可能更容易管理,但只要顺序一致,就不需要这么做。`