图片 8

test命令和grep作业及Sed作业awk作业和循环结构,文本操作倒序输出

Linux系统环境:CentOS 
5.7 i686

1、打印文件的第一列(域)                 : awk ‘{print $1}’ filename
2、打印文件的前两列(域)                 : awk ‘{print $1,$2}’
filename
3、打印完第一列,然后打印第二列  : awk ‘{print $1 $2}’ filename
4、打印文本文件的总行数                : awk ‘END{print NR}’ filename
5、打印文本第一行                          :awk ‘NR==1{print}’
filename
6、打印文本第二行第一列                :sed -n “2, 1p” filename | awk
‘print $1’

009day–test命令和grep作业及Sed作业awk作业和循环结构,009day–testawk

一、test命令

-d :目录                                test  -d  /boot

-s :文件长度 > 0、非空            test  -s  a.txt

-f :正规文件                           test  -f  a.txt

-w :可写                                test  -w  a.txt

-r :可读                                 test  -r   a.txt

-x :可执行                              test  -x  a.txt

-L :符号连接                                     

-u :文件有 suid 位设置

-z :空串

-n :非空串

-eq :等于                               [ 50 -eq 50 ]

-ne :不等于                            [ 50 -ne 60 ]

-gt :大于                                [ 50 -gt 40 ]

-lt :小于                                 [ 50 -lt 60 ]

-ge :大于等于                          [ 50 -ge 50 ]

-le :小于等于                           [ 50 -le 50 ]

比较数字,使用(( ))

其他测试使用 [[ ]]

包含数字比较的混合测试,使用[[ expr1 && expr2 ]] (( expr1 || expr2 ))

du -sh /boot/                          #查看文件大小

find / -type f                           #查看普通文件

find / -name “*.txt”                 #查看根下以.txt结尾的文件

find / -size +30M                     #找出根下大于30M的文件

find / -size +10M -size +30M    #找出根下大于10M且小于30M的文件

grep -rl  ‘root’ /test                  #在/test下找出含root名的文件

 

二、grep作业

-n:显示行号

-o:只显示匹配的内容

-q:静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容

-l:如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep
-rl ‘root’ /etc 

-A:如果匹配成功,则将匹配行及其后n行一起打印出来

-B:如果匹配成功,则将匹配行及其前n行一起打印出来

-C:如果匹配成功,则将匹配行及其前后n行一起打印出来

-c:如果匹配成功,则将匹配到的行数打印出来

-E:等于egrep,扩展

-i:忽略大小写

-v:取反,不匹配

-w:匹配单词

正则表达式及字符处理

目标文件/etc/passwd,使用grep命令或egrep

1.显示出所有含有root的行:

egrep “root” /etc/passwd

2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:

egrep -C 2 “bash” /etc/passwd

  1. 显示出有多少行含有nologin。

egrep -c “nologin” /etc/passwd

4.显示出那些行含有root,并将行号一块输出。

egrep -n “nologin” /etc/passwd

5.显示出文件中

6.新建用户
abominable
abominate
anomie
atomize
编写正则表达式,将他们匹配出来

egrep “a.omi(nabl|nat|z|)e” /etc/passwd

7.建四个用户
Alex213sb
Wpq2222b
yH438PIG
egon666 egon
过滤出用户名组成是字母+数字+字母的行

egrep ‘^[a-Z]+[0-9]+[a-Z]+’ /etc/passwd

8.显示出/etc目录下所有包含root的文件名

egrep -rl “/root” /etc

  1. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行

grep -v ‘^#’ /etc/ssh/sshd_config |grep -v ‘^ *$’

三、Sed作业:以/etc/passwd文件为模板

1,删除文件每行的第一个字符。

sed -r ‘s/^(.)(.*)/\2/’ /etc/passwd

2,删除文件每行的第二个字符。

sed -r ‘s/^(.)(.)(.*)/\1\3/’ /etc/passwd

3,删除文件每行的最后一个字符。

sed -r ‘s/(.*)(.)$/\1/’ /etc/passwd

4,删除文件每行的倒数第二个字符。

sed -r ‘s/(.*)(.)(.)$/\1\3/’ /etc/passwd

5,删除文件每行的第二个单词。

sed -r ‘s/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\1\2\4/’
/etc/passwd

6,删除文件每行的倒数第二个单词。

sed -r ‘s/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)$/\1\3\4/’
/etc/passwd

7,删除文件每行的最后一个单词。

sed -r ‘s/([^a-Z]+)([a-Z]+)$/\1/’ /etc/passwd

8,交换每行的第一个字符和第二个字符。

sed -r ‘s/^(.)(.)(.*)/\2\1\3/’ /etc/passwd

9,交换每行的第一个字符和第二个单词。

sed -r
‘s/^(.)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\4\2\3\1\5/’
/etc/passwd

10,交换每行的第一个单词和最后一个单词。

sed -r
‘s/^([a-Z]+)([^a-Z]+)(.+)([^a-Z]+)([a-Z]+)$/\5\2\3\4\1/’
/etc/passwd

11,删除一个文件中所有的数字。

sed -r ‘s/[0-9]+//g’ /etc/passwd

12,删除每行开头的所有空格。

sed -r ‘s/^ *//g’ /etc/passwd

13,用制表符替换文件中出现的所有空格。

sed -r ‘s/ /\t/g’ /etc/passwd

14,把所有大写字母用括号()括起来。

sed -r ‘s/[A-Z]/(&)/g’ /etc/passwd

15,打印每行3次。

sed ‘p;p’ /etc/passwd

16,隔行删除。

sed ‘1~2d’ /etc/passwd

17,把文件从第2行到第5行复制到第7行后面。(选做题)

sed ‘1h;3,5H;7G’ test

18,把文件从第2行到第5行移动到第7行后面。(选做题)

sed ‘2h;3,5H;7G’ test

19,只显示每行的第一个单词。

sed -r ‘s/^([a-Z]+)([^a-Z]+)(.*)$/\1/’ /etc/passwd

20,打印每行的第一个单词和第三个单词。

sed -r
‘s/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)$/\1\
\5/’ /etc/passwd

四、awk作业

打印uid在30~40范围内的用户名。

awk -F: ‘$3>29&&$3<41{print $1}’ /etc/passwd

打印第5-10行的行号和用户名

awk -F: ‘NR>4&&NR<11{print $1,NR}’ etc/passwd

打印奇数行

awk -F: ‘NR%2{ print NR,$0}’ /etc/passwd

打印偶数行

awk -F: ‘!(NR%2){print NR,$0}’ /etc/passwd

打印字段数大于5的行

awk -F: ‘NF>5{print NR,$0}’ /etc/passwd

打印UID不等于GID的用户名

awk -F: ‘$3!=$4{print NR,$1}’ /etc/passwd

if 结构

图片 1

#!/bin/bash

var='/etc/init.d'
#var='/dev/sda'
if [ -d $var ]                              #如果$var是目录文件,则输出$var is directory
    then
        echo "$var is directory"
elif [ -b $var ]                            #如果$var是block块,则输出$var is block
    then
        echo "$var is block"
elif [ -f $var ]                             #如果$var是正规文件,则输出$var is regular file
    then
        echo "$var is regular file"
else                                           #以上都不满足则输出unknow
        echo 'unknow'
fi                                               #fi表示if语句结束

View Code

接收输入参数的if语句

图片 2

#!/bin/bash

if [ -d $1 ]                                  #$1表示输入的第一个参数

    then

        echo "$1 is directory"

elif [ -b $1 ]

    then

        echo "$1 is block"

elif [ -f $1 ]

    then

        echo "$1 is regular file" else echo 'unknown'

fi

View Code

while循环

图片 3

#!/bin/bash

login=0

while [ $login != 1 ]

do

    read -p 'please input your name: ' name                 #输入用户名

    read -p 'please input your password: ' pwd              #输入密码

    if [ -z $name ] || [ -z $pwd ]                                  #判断输入是否有输入为空,返回继续循环

        then

            continue

    fi

    if [ $name == 'mu' ] && [ $pwd == '123' ]              #匹配正确,则输出登录成功

        then

            echo 'login sucessful'

            login=1                                                       #方便退出循环 fi done

View Code

练习while循环

图片 4

#!/bin/bash

var1=AAA

var2=BBB

var3=CCC

while :

do

    clear #清屏

    echo -e "A:${var1}\nB:${var2}\nC:${var3}" #

    temp=$var1

    var1=$var2

    var2=$var3

    var3=$temp

    sleep 1

done

View Code

 

资料来源:http://www.cnblogs.com/linhaifeng/p/6602149.html#_label4

 

一、test命令 -d :目录 test -d /boot -s :文件长度 0、非空 test -s a.txt
-f :正…

测试文件:cat test.bat

 

图片 5

 

1、系统命令:tac test.bat

#(获取test文件的第4行)

图片 6

#cat test| awk ‘NR==4’或cat test|sed -n ‘4p’直接获取某一行的数据

2、awk方法: awk ‘{a[NR]=$0}END{for(i=NR;i>0;i–)print a[i]}’
test.bat

    shell里面的赋值方法有两种,格式为
    1) arg=`(命令)`
    2) arg=$(命令)
因此,如果想要把某一文件的总行数赋值给变量nlines,可以表达为:
    1) nlines=`(awk ‘END{print NR}’ filename)`
或者

图片 7

    2) nlines=$(awk ‘END{print NR}’ filename)

3、sed方法: sed ‘1!G;h;$!d’ test.bat

 

图片 8

 

图片 9

awk练习题

   wang     4
   cui      3
   zhao     4
   liu      3
   liu      3
   chang    5
   li       2

   1 通过第一个域找出字符长度为4的
   2 当第二列值大于3时,创建空白文件,文件名为当前行第一个域$1 (touch $1)
   3 将文档中 liu 字符串替换为 hong
   4 求第二列的和
   5 求第二列的平均值
   6 求第二列中的最大值
   7 将第一列过滤重复后,列出每一项,每一项的出现次数,每一项的大小总和

   1、字符串长度
    awk ‘length($1)==”4″{print $1}’
   2、执行系统命令
    awk ‘{if($2>3){system (“touch “$1)}}’
   3、gsub(/r/,”s”,域) 在指定域(默认$0)中用s替代r  (sed ‘s///g’)
    awk ‘{gsub(/liu/,”hong”,$1);print $0}’ a.txt
   4、列求和
    df -h | awk ‘{a+=$2}END{print a}’
   5、列求平均值
    df -h | awk ‘{a+=$2}END{print a/NR}’
    df -h | awk ‘{a+=$2;b++}END{print a,a/b}’ 
   6、列求最大值
    df -h | awk ‘BEGIN{a=0}{if($2>a) a=$2 }END{print a}’
   7、将第一列过滤重复列出每一项,每一项的出现次数,每一项的大小总和
    awk ‘{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}’