1. tr 按列替换

  • echo "{123}" | tr -d '{}' 删除输入中的 “{” 和 “}”

  • cat testfile |tr a-z A-Z
    将文件testfile中的小写字母全体转换来大写字母

1. tr 按列替换

  • echo "{123}" | tr -d '{}' 删除输入中的 “{” 和 “}”

  • cat testfile |tr a-z A-Z
    将文件testfile中的小写字母全体转换到大写字母

linux查看目录下全部文件内容中是或不是含有某些字符串,linux字符串

来源:

搜索目录下的富有文件中是否包含有个别字符串
find .|xargs grep -ri “IBM”
招来目录下的装有文件中是还是不是带有有些字符串,并且只打字与印刷出文件名
find .|xargs grep -ri “IBM” -l
1.正则表明式
(1)正则表明式一般用来描述文本格局的与众差异用法,由一般字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。
(2)基本元字符集及其含义
^ :只匹配行首。 如^a 匹配以a先河的行abc,a2e,a12,aaa,……
:只匹配行尾。   如^a 匹配以a结尾的行bca,12a,aaa,…….   
      * :匹配0个或五个此单字符。 如(a)* 匹配 空,a,aa,aaa,….   
      [] :只匹配[]澳门金沙国际 ,内字符。能够是八个单字符,也足以是字符连串,用”,”将内部要合营的不等字符串分开。也足以行使-来表示[]内字符系列的限定,如[1-5]表示[12345]   
      \ :只用来遮掩三个元字符的特别含义。 如*,\’,\”,|,+,\^,. 等   
      .:(点)只十二分任意单字符。   
      pattern{n}:只用来同盟前边pattern出现的次数.n为次数。如a{2}匹配aa.   
      pattern{n,}:含义同上,但次数至少为n.如a{2,}匹配aa,aaa,aaaa,…..   
      pattern{n,m}:含义同上,但次数在n和m之间。如a{2,4}匹配aa,aaa,aaaa多个   
  (3)举例表达:   
      ^ :匹配空行
^.$ :匹配包涵二个字符的行
*.pas :匹配以*.pas结尾的享有字符或文件
[0123456789]或[0-9] :假定要同盟任意三个数字
[a-z] :任意小写字母
[A-Za-z] :任意大小写字母
[S,s] :匹配大小写S
[0-9]{3}.[0-9]{3}.[0-9]{3}.[0-9]{3} :匹配IP地址
[0-9]{3}八个0-9组合的字符串;.
:匹配点(注意那里点是特别的字符,所以要用”\”来屏蔽其意义)
2.find介绍
(1)查找具有有些特点文件的通令,可遍历当前目录甚至于整个文件系统来查看某个文件或目录,其遍历大的文件系统时相似位于后台执行。
(2)find命令的相似情势
find pathname -options [-print -exec -ok]
-pathname
:find命令所查找的目录路径。如用”.”来表示近日的目录,用/来代表系统根目录
-print :find命令将卓殊的文书输出到标准输出
-exec:
find命令对一双两好的文书执行该参数所提交的shell命令,相应的通令格局为
‘command’{} \; (注意{}和\以内的空格)
-ok 和
-exec的效果一样,只不过以一种尤其安全的形式来举办该参数所提交的shell命令,在履行每贰个指令此前,都会付出提醒,让用户来规定是否执行。
options有如下两种:
-name :遵照文件名查找文件
-perm :依照文件权限来查找文件
-user :依照文件属主来查找文件
-group :依照文件所属的组来查找文件
-mtime -n +n
依据文件的改变时间来查找文件,-n表示文件更改时间距未来n天以内,+n表示文件更改时间距未来n天从前。find命令还有-atime
和-ctime选项,但它们都和-mtime选项相似。
-size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-nogroup 查找无有效所属组的文书,即该文件所属的组在/etc/groups中不设有
-newer file1 !file2查找更改时间比文件file1新但比文件file2旧的公文
-depth 先查找钦点目录有无匹配文件,若无则再在子目录中寻找
-type 查找某一类其他文书,如
b :块设备文件
d:目录
e:字符设备文件
p;管道文件
l:符号链接文件
f:普通文书
(3)find命令举例
find -name “*.txt” -print 查找txt结尾的文书并出口到荧屏上
find /cmd “.sh” -print 查找/cmd目录下具有sh文件,并出口
find . -perm 755 -print 查找当前目录下放权力限为755的公文,并出口
find pwd -user root -print 查找当前目录下属主为root的公文,并出口
find ./ -group sunwill -print 查找当前目录下所属主是sunwill的公文
find /var -mtime -5 -print 查找/var目录下转移时间为5天内的装有文件
find /var -mtime +5 -print 查找/var目录下转移时间为5天在此以前的全数文件
find /var -newer “myfile1” ! -newer “myfile2” -print
查找/var目录下比myfile1新,可是比myfile2旧的有着文件。
find /var -type d -print 查找/var目录下全体目录
find /var -type l -print 查找/var目录下全数的标志链接文件。
find . -size +一千000c -print 查找当前目录下抢先一千000字节的文本
find / -name “con.file” -depth -print
查找根目录下有无”con.file”,若无则在其子目录中找寻
find . -type f -exec ls -l {} \;
查找当前目录下是或不是有一般文书,若有则执行ls -l
(4)xargs命令

使用find命令的-exec选项处理匹配到的文书时,find命令将享有匹配到的公文一起传递给exec。不幸的是,有个别系统对能够传递给exec的命
令长度有限制,那样find命令运营几分钟之后便是出现溢出荒谬。错误消息平常是“参数列太长”或“参数列溢出”。那正是xargs的用处所在,尤其是与
find命令一道利用,exec会发起八个经过,而xargs会两个,唯有一个
find ./ -perm -7 -print | xargs chmod o-w
查找权限为7的公文并传递给chmod处理
3.grep介绍 (1)grep 的相似格式为 grep [options] 基本正则表明式
[文件]
字符串参数最好应用是双引号括,一是幸免被误会为shell命令,二是足以用来查找多少个单词组成的字符串
-c:只输出匹配行的记数
-i:不区分轻重缓急写(只适用于单个字符)
-h:查询多个文件时不展现文件名
-H:只展现文件名
-l:查询多文本时只输出包涵匹配字符的公文名
-n:只呈现匹配行及其行号
-s:不出示不设有或无匹配文本的错误消息。
-v:显示不分包匹配文本的有所行。
(2)举例表达:
grep ^[^210] myfile 匹配myfile中以非② 、一 、0早先的行
grep “[5-8][6-9][0-3]” myfile
匹配myfile中率先位为5|6|7|8,第几人6|7|8|9,第⑥人为0|1|2|3的多少个字符的行
grep “4{2,4}” myfile 匹配myfile中含有44,444或4444的行
grep “\?” myfile匹配myfile中含有任意字符的行
(3)grep命令类名
[[:upper:]] 表示[A-Z]
[[:alnum:]] 表示[0-9a-zA-Z]
[[:lower:]] 表示[a-z]
[[:space:]] 表示空格恐怕tab键
[[:digit:]] 表示[0-9]
[[:alpha:]] 表示[a-zA-Z]
如:grep “5[[:digit:]][[:digit:]]” myfile
匹配myfile中带有5方始接下去两位都以数字的行。
4.awk介绍
能够从文件或字符串中基于钦赐规则浏览和抽取音信,是一种自解释的变成语言。
(1)awk命令市场价格势 awk [-F filed-spearator] ‘command’ input-files
awk脚本:全数awk命令插入二个文书,并使awk程序可实施,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。awk脚本是由各个操作和情势组成。
格局部分决定动作语句哪一天触发及触发事件。(BEGIN,END)
动作对数码开始展览处理,放在{}内指明(print)
(2)分隔符、域和笔录
awk执行时,其浏览域标记为1,1,2,…n.那种艺术成为域标识。n.。0为全部域。
(3)举例表明:
awk ‘{print 0}’ test.txt |tee test.out 输出test.txt中享有行0表示全体域
awk -F : ‘{print 1} test.txt |tee test.out’   同上。。只是分隔符为”:”   
      awk ‘BEGIN {print “IPDate\n”}{print $1 “\t” $4} END{print “end-of-report”}’ test.txt   
      开端时打字与印刷“IPDate”结束时打字与印刷“end-of-report”中间打字与印刷主体音信,比如总共匹配三条音讯,则输出如下:  
IPDate   
1 first   
2 second   
3 third   
end-of-report   
  (4)匹配操作符 ~ 匹配,!~ 不匹配   
      cat test.txt |awk ‘0~/210.34.0.13/’
匹配test.txt中为210.34.0.13的行
awk ‘0!~/210.34.0.13’ test.txt     匹配test.txt中不是210.34.0.13的行   
      awk ‘{if($1==”210.34.0.13″) print $0}’ test.txt 匹配 test.txt中首先个域为210.34.0.13的行。  
5.sed介绍     sed不与伊始化文件打交道,它操作的只是四个正片,然后全部的转移假使没有重定向到多少个文本,将出口到显示器。   
    sed是一种很关键的文件过滤工具,使用一行命令只怕应用管道与grep与awk相结合。是一种非交互性文本流编辑。   
文本处理工科具集锦,linux查看目录下有所文件内容中是否含有某些字符串。    (1)调用sed的二种方式   
      使用sed命令行格式为:sed [options] sed命令 输入文件   
      使用sed脚本文件格式为:sed[options] -f sed脚本文件 输入文件   
      sed脚本文件[options] 输入文件   
      –不管是选用shell命令行情势或脚本文件措施,假若没有点名输入文件,sed从专业输入中承受输入,一般是键盘或重定向结果。   
    (2)sed 命令的options如下   
        -n:不打印   
        -c:下一下令是编辑命令   
        -f:借使正在调用sed脚本文件   
    (3)sed在文件中询问文本的方式   
          –使用行号,能够是1个简约的数字,或是3个行号的限定   
          –使用正则表达式   
    (4)读取文本的情势   
          x       x为一行号   
          x,y       表示行号范围从x到y   
          /pattern/     查询包蕴格局的行   
          /pattern/pattern/ 查询包蕴三个格局的行   
          pattern/,x   在加以的行号上询问包涵形式的行   
          x,/pattern/   通过行号和方式查询匹配行   
          x,y!       查询不含有钦点行号x和y的行   
      (5)基本sed编辑命令   
            p   打字与印刷匹配行   
            d   删除匹配行   
            =   展现文件行号   
            a\   在定位行号后附加新文本音信   
            i\   在一定行号后插入新文本音信   
            c\   用新文本替换定位文本   
            s     使用替换格局替换相应情势   
            r     从另1个文件中读文件   
            w   写文本到2个文书   
            q     第一个情势匹配实现后推出或及时退出   
            l     呈现与八禁止ASCII代码等价的决定字符   
            {}   在固化行执行的通令组   
            n     从另1个文件中读文件下一行,并附加在下一行   
            g     将模式2粘贴到/pattern n/   
            y     传送字符   
    (6)举例表明:   
          sed -n ‘2p’ test.txt 打字与印刷第叁行的新闻(注意:-n是不打字与印刷不匹配的音讯,若没加-n,则打印文件的全数音讯而不是匹配音信)   
          sed -n ‘1,4p’ test.txt 打字与印刷第2行到第伍行的新闻   
          sed -n ‘/los/p’ test.txt方式匹配los,并打字与印刷出来   
          sed -n ‘2,/los/p’ test.txt 从第三行开首。。知道匹配第②个los   
          sed -n ‘/^/p’ test.txt 匹配空行
sed -n -e ‘/^/p’ -e ‘/^/=’
test.txt 打字与印刷空行及行号
sed -n ‘/good/a\morning’ test.txt 在万分到的good后边附加morning
sed -n ‘/good/i\morning’ test.txt 在合营到的good后边插入morning
sed -n ‘/good/c\morning’ test.txt 将协作到的good替换来morning
sed ‘1,2d’ test.txt 删除第1和2行
sed ‘s/good/good morning/g’ test.txt 匹配good并替换来goodmorning
send ‘s/good/& hello /p’ test.txt 匹配到good就在其背后加上hello
send ‘s/good/ hello &/p’ test.txt 匹配到good就在其前方加上hello
6.联合与分割(sort,uniq,join,cut,paste,split) (1)sot命令
sort [options] files 许多两样的域按差别的列顺序排序
-c 测试文件是还是不是曾经排序
-m 合并三个排序文件
-u 删除全体同一行
-o 存款和储蓄sort结果的输出文件名
-t 域分隔符,用非空格或tab开始排序
+n :n 为列号,使用此列号早先排序
-n 钦赐排序是域上的数字分类项
-r 比较求逆
sort -c test.txt 测试文件是还是不是分类过
sort -u test.txt 排序并联合一样的行
sort -r test.txt 以相反的顺序排列
sort -t “/” +2 test.txt 以”/”分隔,第四个域开头分类
(2)uniq命令
uniq [options ] files 从1个文书文件中剔除或禁止重复行
-u 只呈现不重复行
-d 只展现有再一次数据行,各个重复行只彰显当中一行
-c 打字与印刷每一重复行现身次数
-f :n为数字,前n个域被忽略
uniq -f 2 test.txt 忽略前2个域
(3)join 命令
join [options] file1 file2 用来今后自七个分类文本文件的行连在协同
-an,n为一数字,用于连接时从文件n中展现不匹配行
-onm ,连接域,n为文件号,m为域号
-jnm,n为文件号,m为域号,使用别的域作连接域
-t ,域分隔符。用来安装非空格或tab键的域分隔符。
(4)split命令
split -output_file_size intput_filename output_filename
用来将大文件分割成小文件。
-b n,每一种分割文件的大小n
-C n,每种分割文件一行最多n字节
-l n,每一个分割文件的行数
-n,同-l n
split -10 test.txt 将test.txt分割成10行的小文件
(5)cut 命令
cut -c n1-n2 filename 展现每行从开端算起 n1 到 n2 的文字。
cut -c 3-5 test.txt 显示test.txt中每行从第叁到第5个字符

转自:

2. cut : cut [-b] [file] 列切分

cut
命令从文件的每一行剪切字节、字符和字段并将那几个字节、字符和字段写至标准输出。

设若不点名 File 参数,cut 命令将读取标准输入。必须钦定 -b、-c 或 -f
标志之一。

  • echo "123,456" | cut -d "," -f 1
    以”,”分隔截取输入中的每行的首先部分剧情输出.

  • who | cut -b 3 以字节为分隔, 输出每行的第伍个字节. -c
    是以字符为分隔

  • count=$(echo -e "${line}" | cut -f 2)
    其中,line中字符是以tab作为分隔符!

2. cut : cut [-b] [file] 列切分

cut
命令从文件的每一行剪切字节、字符和字段并将那一个字节、字符和字段写至标准输出。

即便不钦赐 File 参数,cut 命令将读取标准输入。必须钦赐 -b、-c 或 -f
标志之一。

  • echo "123,456" | cut -d "," -f 1
    以”,”分隔截取输入中的每行的第叁局地剧情输出.

  • who | cut -b 3 以字节为分隔, 输出每行的第二个字节. -c
    是以字符为分隔

  • count=$(echo -e "${line}" | cut -f 2)
    其中,line中字符是以tab作为分隔符!

内容目录:

  • find 文件查找
  • grep 文本搜索
  • xargs
    命令行参数转换
  • sort 排序
  • uniq 化解重复行
  • 用tr进行转移
  • cut 按列切分文本
  • paste
    按列拼接文本
  • wc
    总计行和字符的工具
  • sed 文本替换利器
  • awk
    数据流处理工科具
  • 迭代文件中的行、单词和字符

正文将介绍Linux下选择Shell处理文件时最常用的工具:
find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;
提供的例子和参数都以最常用和无限实用的;
本人对shell脚本使用的尺度是命令单行草写,尽量不要跨越2行;
假如有进一步复杂的天职需求,依然考虑python吧;

3. chown, chgrp, chmod 权限

sudo chgrp root * 修改当前目录下有所文件为root组

sudo chown root * 修改当前目录下全部文件的owner为root

sudo chmod 777 -R dir 递归修改dir的权柄为777

sudo chmod 755 file.sh 修改file.sh为任何人可实施权限

3. chown, chgrp, chmod 权限

sudo chgrp root * 修改当前目录下具有文件为root组

sudo chown root * 修改当前目录下拥有文件的owner为root

sudo chmod 777 -R dir 递归修改dir的权杖为777

sudo chmod 755 file.sh 修改file.sh为任何人可实施权限

find 文件查找

  • 查找txt和pdf文件

      find . \( -name "*.txt" -o -name "*.pdf" \) -print
    
  • 正则情势查找.txt和pdf

      find . -regex  ".*\(\.txt|\.pdf\)$"
    

    -iregex: 忽略大小写的正则

  • 否定参数
    寻找全部非txt文本

       find . ! -name "*.txt" -print
    
  • 点名搜索深度
    打字与印刷出当前目录的公文(深度为1)

      find . -maxdepth 1 -type f  
    

4. sudo

  • sudo -l 查看当前用户运营命令权限

  • sudo -u <user> command 使用user用户执行命令command

4. sudo

  • sudo -l 查看当前用户运转命令权限

  • sudo -u <user> command 使用user用户执行命令command

定制搜索

  • 按类型搜索:

      find . -type d -print  //只列出所有目录
    

    -type f 文件 / l 符号链接

  • 按时间寻找:
    -atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)
    -mtime 修改时间 (内容被修改)
    -ctime 变化时间 (元数据或权限变化)
    如今7天被访问过的有所文件:

      find . -atime 7 -type f -print
    
  • 按大小搜索:
    w字 k M G
    检索大于2k的文件

      find . -type f -size +2k
    

    按权限查找:

      find . -type f -perm 644 -print //找具有可执行权限的所有文件
    

    按用户查找:

      find . -type f -user weber -print// 找用户weber所拥有的文件
    

5. uniq 去重

uniq -c file 在每行的边沿扩张重复的数据。

5. uniq 去重

uniq -c file 在每行的边上扩展重复的数额。

找到后的继续动作

  • 删除:
    剔除当前目录下拥有的swp文件:

      find . -type f -name "*.swp" -delete
    
  • 履行动作(强大的exec)

      find . -type f -user root -exec chown weber {} \; //将当前目录下的所有权变更为weber
    

    注:{}是三个新鲜的字符串,对于每二个金童玉女的公文,{}会被替换来相应的文件名;
    eg:将找到的文书全都copy到另2个索引:

      find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
    
  • 组合四个指令
    tips: 如果急需后续执行多个指令,能够将三个指令写成一个本子。然后
    -exec 调用时实施脚本即可;

      -exec ./commands.sh {} \;
    

6. nl 输出前加行号

  • nl file在出口的始末前加行号

  • nl -b a file 碰到空行,也加行号。

  • nl -n rz -w 3 file 行号3位对其,前面补0.

6. nl 输出前加行号

  • nl file在输出的内容前加行号

  • nl -b a file 蒙受空行,也加行号。

  • nl -n rz -w 3 file 行号3位对其,前面补0.

-print的定界符

暗中认可使用’\n’作为文件的定界符;
-print0 使用’\0’作为文件的定界符,这样就能够查找包括空格的文件;

7. shuf 打乱文书相继

  • shuf sort_file -o rsort_file

7. shuf 打乱文件相继

  • shuf sort_file -o rsort_file

grep 文本搜索

grep match_patten file // 暗中认可访问匹配行

  • 常用参数
    -o 只输出匹配的公文行 VS -v 只输出没有匹配的文本行
    -c 总括文件中涵盖文本的次数

      grep -c "text" filename
    

    -n 打印匹配的行号
    -i 搜索时马虎大小写
    -l 只打字与印刷文件名

  • 在浩如烟海目录中对文件递归搜索(程序员搜代码的最爱):

      grep "class" . -R -n
    
  • 同盟四个方式

      grep -e "class" -e "vitural" file
    
  • grep输出以\0作为结尾符的文书名:(-z)

      grep "test" file* -lZ| xargs -0 rm
    

8. split 将文件切分

  • split -5000 filesplit -l 5000 file 将file按行切分成多个公文,
    文件最大作为四千

  • split -5000 -d file 以数字作为后缀,默许:xaa,xab,xac,
    现在x00,x01,x02

  • split file.txt -b 10M 将文件file.txt平均切分成10M

8. split 将文件切分

  • split -5000 filesplit -l 5000 file 将file按行切分成多少个文件,
    文件最大作为四千

  • split -5000 -d file 以数字作为后缀,暗中同意:xaa,xab,xac,
    现在x00,x01,x02

  • split file.txt -b 10M 将文件file.txt平均切分成10M

xargs 命令行参数转换

xargs
能够将输入数据转载为特定命令的命令行参数;那样,能够匹配很多限令来整合使用。比如grep,比如find;

  • 将多行输出转速为单行输出
    cat file.txt| xargs
    \n 是多行文本间的定界符

  • 将单行转化为多行输出
    cat single.txt | xargs -n 3
    -n:钦定每行显示的字段数

联合文件

  • cat x* > file.txt 将以x起来的富有文件合并到file.txt`中

  • cat file1 file2 > file3 将file1和file2合并保存到file3中.

文件内容逐条, 依照file1+file2的相继保存到file3

统一文件

  • cat x* > file.txt 将以x起来的具有文件合并到file.txt`中

  • cat file1 file2 > file3 将file1和file2合并保存到file3中.

文件内容逐条, 依照file1+file2的一一保存到file3

xargs参数表达

-d 定义定界符 (默许为空格 多行的定界符为 \n)
-n 钦点输出为多行
-I {}
钦命替换字符串,那几个字符串在xargs扩张时会被交流掉,用于待执行的吩咐须要四个参数时
eg:

cat file.txt | xargs -I {} ./command.sh -p {} -1

-0:指定\0为输入定界符
eg:总括程序行数

find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l

形式切分csplit

将文件文件file以第 2 表现分界点切割成两份,命令: csplit testfile 2

格局切分csplit

将文件文件file以第 2 表现分界点切割成两份,命令: csplit testfile 2

sort 排序

字段表明:
-n 按数字进行排序 VS -d 按字典序进行排序
-r 逆序排序
-k N 钦赐按第N列排序
eg:

sort -nrk 1 data.txt
sort -bd data // 忽略像空格之类的前导空白字符

文件求交,差,补

cat a b | sort | uniq > c # c 是 a 并 b

cat a b | sort | uniq -d > c # c 是 a 交 b

cat a b b | sort | uniq -u > c # c 是 a – b

文本求交,差,补

cat a b | sort | uniq > c # c 是 a 并 b

cat a b | sort | uniq -d > c # c 是 a 交 b

cat a b b | sort | uniq -u > c # c 是 a – b

uniq 化解重复行

  • 破除重复行

      sort unsort.txt | uniq 
    
  • 总括各行在文件中现身的次数

      sort unsort.txt | uniq -c
    
  • 找出重复行

      sort unsort.txt | uniq -d
    

    可钦点每行中须求比较的再次内容:-s 开首地点 -w 比较字符数

9. sed按行操作文本(大文本操作)

大文本数据修改,编辑,保存,不可能用编辑器打开,能够正视sed对大文件实行修改

sed编辑行以1为起首index!

9. sed按行操作文本(大文本操作)

大文本数据修改,编辑,保存,无法用编辑器打开,能够正视sed对大文件进行修改

sed编辑行以1为开始index!

用tr实行转移

  • 通用用法

      echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符
      cat text| tr '\t' ' '  //制表符转空格
    
  • tr删除字符

      cat file | tr -d '0-9' // 删除所有数字
    

    -c 求补集

      cat file | tr -c '0-9' //获取文件中所有数字
      cat file | tr -d -c '0-9 \n'  //删除非数字数据
    
  • tr压缩字符
    tr -s 压缩文件中出现的重复字符;最常用于压缩多余的空格

      cat file | tr -s ' '
    
  • 字符类
    tr中可用各样字符类:
    alnum:字母和数字
    alpha:字母
    digit:数字
    space:空白字符
    lower:小写
    upper:大写
    cntrl:控制(非可打字与印刷)字符
    print:可打字与印刷字符
    采取方法:tr [:class:] [:class:]

      eg: tr '[:lower:]' '[:upper:]'
    

详解

  • -e 数次编辑

nl file | sed -e '3,$d' -e 's/bash/blueshell/'
删除第2行到终极一行,然后将1-2行中匹配bash的字符串替换到blueshell字符串

sed -e 4a\newLineContent file 在第⑥行后天添加一行内容newLineContent

  • -n 仅呈现script处理后的结果。

nl /etc/passwd | sed -n '5,7p' 仅列出文件的5-7行。

nl /etc/passwd | sed -n '/root/p' 仅列出匹配root的行

  • -i 直接编辑源文件危急动作

sed -i 's/\.$/\!/g' file 将file的末梢一行中的.替换成!

sed -i '$a # This is a test' file
在最终一行,再添加一行内容:# This is a test' file

nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'
首先匹配全部bash行,然后实施{}里面包车型地铁一组动作,替换bash为blueshell,p打字与印刷,q退出!

-e 接的动作:

  • a :新增, 在当下行的下一行添加,是新的一条龙

  • i :插入, 在当前行的上一行插入,是新的一行

  • c :取代

  • d :删除, 前边没有内容;

nl file | sed '2,5d' 删除第壹到五行!

sed '2d' file 删除第3行

nl file | sed -n '/root/p' 删除全数行中包罗root的行!

  • p :打印列。通常 p 与参数 sed -n 一起用

  • s :替换,/要被代表的字串/新的字串/g

详解

  • -e 数次编纂

nl file | sed -e '3,$d' -e 's/bash/blueshell/'
删除第叁行到结尾一行,然后将1-2行中匹配bash的字符串替换来blueshell字符串

sed -e 4a\newLineContent file 在第6行后天添加一行内容newLineContent

  • -n 仅展现script处理后的结果。

nl /etc/passwd | sed -n '5,7p' 仅列出文件的5-7行。

nl /etc/passwd | sed -n '/root/p' 仅列出匹配root的行

  • -i 直接编辑源文件高危动作

sed -i 's/\.$/\!/g' file 将file的终极一行中的.替换成!

sed -i '$a # This is a test' file
在终极一行,再添加一行内容:# This is a test' file

nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'
首先匹配全部bash行,然后实施{}当中的一组动作,替换bash为blueshell,p打印,q退出!

-e 接的动作:

  • a :新增, 在近期行的下一行添加,是新的一行

  • i :插入, 在近期行的上一行插入,是新的一条龙

  • c :取代

  • d :删除, 前面没有内容;

nl file | sed '2,5d' 删除第②到五行!

sed '2d' file 删除第一行

nl file | sed -n '/root/p' 删除全数行中包罗root的行!

  • p :打印列。通常 p 与参数 sed -n 一起用

  • s :替换,/要被替代的字串/新的字串/g

cut 按列切分文本

  • 截取文件的第三列和第④列:

      cut -f2,4 filename
    
  • 去文件除第2列的全部列:

      cut -f3 --complement filename
    
  • -d 内定定界符:

      cat -f2 -d";" filename
    
  • cut 取的界定
    N- 第N个字段到最后
    -M 第②个字段为M
    N-M N到M个字段

  • cut 取的单位
    -b 以字节为单位
    -c 以字符为单位
    -f 以字段为单位(使用定界符)
  • eg:

      cut -c1-5 file //打印第一到5个字符
      cut -c-2 file  //打印前2个字符
    

使用

  1. 招来行号 grep -n --color '您的司机账户已被冻结' outbox.csv

  2. 剔除相应行号保存: sed -e 5d file1 > ./file2 删除第伍行
    并保存到当前目录下的file2文件中。

  3. 剔除匹配项: cat file1 | sed '/hello/d' > ./file2
    删除全部行中包涵hello字符串的行保存。

nl file1 | sed '/hello/d' > ./file2
在每行内容前加3个行号,保存到文件中!

使用

  1. 招来行号 grep -n --color '您的司机账户已被冻结' outbox.csv

  2. 删除相应行号保存: sed -e 5d file1 > ./file2 删除第六行
    并保存到当前目录下的file2文件中。

  3. 删除匹配项: cat file1 | sed '/hello/d' > ./file2
    删除全部行中包涵hello字符串的行保存。

nl file1 | sed '/hello/d' > ./file2
在每行内容前加三个行号,保存到文件中!

paste 按列拼接文本

将四个公文按列拼接到一起;

cat file1
1
2

cat file2
colin
book

paste file1 file2
1 colin
2 book

暗中同意的定界符是制表符,能够用-d指明定界符
paste file1 file2 -d “,”
1,colin
2,book

10. 只输出一行中匹配的字符串.

语法: grep -o 'regex'

  • less file* | grep type | grep -o 'user\[.*\]user_id' | grep -o '\[.*\]' | sort | uniq
    file开始的享有文件中,每行包涵type的字符串,提取字符串中以user[.*]user_id格局存在[]中的内容!

10. 只输出一行中相当的字符串.

语法: grep -o 'regex'

  • less file* | grep type | grep -o 'user\[.*\]user_id' | grep -o '\[.*\]' | sort | uniq
    file起来的兼具文件中,每行李包裹括type的字符串,提取字符串中以user[.*]user_id花样存在[]中的内容!

wc 总括行和字符的工具

wc -l file // 总结行数
wc -w file // 总括单词数
wc -c file // 总括字符数

sed 文本替换利器

  • 首处替换

      seg 's/text/replace_text/' file   //替换每一行的第一处匹配的text
    
  • 全局替换

       seg 's/text/replace_text/g' file
    

    默许替换后,输出替换后的内容,借使需求直接沟通原来的文章件,使用-i:

      seg -i 's/text/repalce_text/g' file
    
  • 移除空白行:

      sed '/^$/d' file
    
  • 变量转换
    已同盟的字符串通过标志&来引用.

    echo this is en example | seg 's/\w+/[&]/g'
    $>[this]  [is] [en] [example]
    
  • 子串匹配标记
    先是个地位卓殊的括号内容使用标记 \1 来引用

      sed 's/hello\([0-9]\)/\1/'
    
  • 双引号求值
    sed经常用单引号来引用;也可选用双引号,使用双引号后,双引号会对表明式求值:

      sed 's/$var/HLLOE/'
    

    当使用双引号时,大家得以在sed样式和替换字符串中钦赐变量;

    eg:
    p=patten
    r=replaced
    echo "line con a patten" | sed "s/$p/$r/g"
    $>line con a replaced
    
  • 别的示例
    字符串插入字符:将文件中每行内容(PEKSHA) 转换为 PEK/SHA

      sed 's/^.\{3\}/&\//g' file
    

awk 数据流处理工具

  • awk脚本结构
    awk ‘ BEGIN{ statements } statements2 END{ statements } ‘

  • 做事办法
    1.履行begin中语句块;
    2.从文件或stdin中读入一行,然后实施statements2,重复这些进程,直到文件全体被读取完毕;
    3.执行end语句块;

print 打字与印刷当前行

  • 使用不带参数的print时,会打字与印刷当前行;

      echo -e "line1\nline2" | awk 'BEGIN{print "start"} {print } END{ print "End" }'
    
  • print 以逗号分割时,参数以空格定界;

    echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; \
    print var1, var2 , var3; }'
    $>v1 V2 v3
    
  • 采纳-拼接符的章程(””作为拼接符);

    echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; \
    print var1"-"var2"-"var3; }'
    $>v1-V2-v3
    

特别变量: N大切诺基 NF $0 $1 $2

N卡宴:表示记录数据,在实施进程中对相应前行号;
NF:表示字段数量,在实践进度总对应当进步的字段数;
$0:这些变量包罗执行进程中当前行的文书内容;
$1:第③个字段的文本内容;
$2:第三个字段的公文内容;

echo -e "line1 f2 f3\n line2 \n line 3" | awk '{print NR":"$0"-"$1"-"$2}'
  • 打字与印刷每一行的第壹和第三个字段:

      awk '{print $2, $3}' file
    
  • 总括文件的行数:

      awk ' END {print NR}' file
    
  • 添加每一行的首先个字段:

      echo -e "1\n 2\n 3\n 4\n" | awk 'BEGIN{num = 0 ;
      print "begin";} {sum += $1;} END {print "=="; print sum }'
    

传送外部变量

var=1000
echo | awk '{print vara}' vara=$var #  输入来自stdin
awk '{print vara}' vara=$var file # 输入来自文件

用样式对awk处理的行开始展览过滤

awk ‘NR < 5’ #行号小于5
awk ‘NR==1,NR==4 {print}’ file #行号等于1和4的打字与印刷出来
awk ‘/linux/’ #涵盖linux文本的行(能够用正则表明式来内定,一流无敌)
awk ‘!/linux/’ #不包涵linux文本的行

设置定界符

利用-F来设置定界符(暗中同意为空格)
awk -F: ‘{print $NF}’ /etc/passwd

读取命令输出

利用getline,将表面shell命令的出口读入到变量cmdout中;

echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout }'

在awk中采纳循环

for(i=0;i<10;i++){print $i;}
for(i in array){print array[i];}

eg:
以逆序的花样打字与印刷行:(tac命令的完毕)

seq 9| \
awk '{lifo[NR] = $0; lno=NR} \
END{ for(;lno>-1;lno--){print lifo[lno];}
} '

awk实现head、tail命令

  • head:

      awk 'NR<=10{print}' filename
    
  • tail:

      awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){ \
      print buffer[i %10]} } ' filename
    

打字与印刷钦点列

  • awk格局达成:

      ls -lrt | awk '{print $6}'
    
  • cut方式达成

      ls -lrt | cut -f6
    

打字与印刷内定文本区域

  • 规定行号

      seq 100| awk 'NR==4,NR==6{print}'
    
  • 规定文件
    打字与印刷处于start_pattern 和end_pattern之间的文本;

      awk '/start_pattern/, /end_pattern/' filename
    

    eg:

    seq 100 | awk '/13/,/15/'
    cat /etc/passwd| awk '/mai.*mail/,/news.*news/'
    

awk常用内建函数

index(string,search_string):返回search_string在string中冒出的地点
sub(regex,replacement_str,string):将正则匹配到的首先处剧情替换为replacement_str;
match(regex,string):检查正则表明式是还是不是能够匹配字符串;
length(string):再次回到字符串长度

echo | awk '{"grep root /etc/passwd" | getline cmdout; print length(cmdout) }'

printf 类似c语言中的printf,对输出进行格式化
eg:

seq 10 | awk '{printf "->%4s\n", $1}'

迭代文件中的行、单词和字符

1. 迭代文件中的每一行

  • while 循环法

    while read line;
    do
    echo $line;
    done < file.txt
    改成子shell:
    cat file.txt | (while read line;do echo $line;done)
    
  • awk法:
    cat file.txt| awk ‘{print}’

2.迭代一行中的每二个单词

for word in $line;
do 
echo $word;
done

3. 迭代每一个字符

${string:start_pos:num_of_chars}:从字符串中提取2个字符;(bash文本切片)
${#word}:再次来到变量word的尺寸

for((i=0;i<${#word};i++))
do
echo ${word:i:1);
done

正文为《linux Shell脚本攻略》的读书笔记,文中首要内容和示范来自于
《linux
Shell脚本攻略》;

Posted by: 大CC | 18NOV,2013
博客:blog.me115.com
微博:新浪新浪

相关文章