Linux 文本操作命令

如何生成一串整数数列

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 sls -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.txtctrl 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选项,后面可以设定间隔符。(是不是想起了cutpaste-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

在本例中,即使缺少附加信息,第一个字段(名字)也必须存在于每个文件中,否则命令会因错误而失败。对内容进行排序有帮助,而且可能更容易管理,但只要顺序一致,就不需要这么做。`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值