linux基础-笔记02

5.文本处理

•cut:显示切割的行数据

–f:选择显示的列

–s:不显示没有分隔符的行

–d:自定义分隔符

例:以“ ”作分割显示第1~3 m列: cut -s -d' ' -f1-3 grep.txt

•sort:排序文件的行

–n:按数值排序

–r:倒序

–t:自定义分隔符

–k:选择排序列

–u:合并相同行

–f:忽略大小写

例:以空格分割,第二行数字排序,倒序:sort -t' ' -k2 -nr sort.txt

•wc:做统计

例计算多少行:wc -l sort.txt

ls -l /etc | wc -l

•sed:行编辑器

–sed [options] 'AddressCommand' file ...

–  -n: 静默模式,不再默认显示模式空间中的内容

–  -i: 直接修改原文件

–  -e SCRIPT -e SCRIPT:可以同时执行多个脚本

–  -f /PATH/TO/SED_SCRIPT

–  -r: 表示使用扩展正则表达式

行编辑器Command

–d: 删除符合条件的行;

–p: 显示符合条件的行;

–a \string: 在指定的行后面追加新行,内容为string

–  \n:可以用于换行

–i \string: 在指定的行前面添加新行,内容为string

–r FILE: 将指定的文件的内容添加至符合条件的行处

–w FILE: 将地址指定的范围内的行另存至指定的文件中;

–s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串

•g: 行内全局替换

•i: 忽略字符大小写

•s///: s###, s@@@ 

•  \(\), \1, \2

:1.在第一行下追加一行“hello,world”:sed -i "1a\hello,world" sort.txt

2..删去hello,world:sed “2d” sort.txt or sed "/hello/d" sort.txt

3.显示带数字的行: sed -n "/[0-9]/p" sort.txt

4.查找并替换(扩大查找的范围已达到精确替换):sed "s/id:[0-6]:initdefault:/id:5:initdefault:/"

inittab or sed "s/\(id:\)[0-6]\(:initdefault:\)/\15\2/" inittab

•行编辑器Address

–可以没有

–给定范围

–查找指定行/str/

 

•awk

–awk是一个强大的文本分析工具。

–相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。

–简单来说awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。

格式:•awk -F '{pattern + action}' {filenames}

–支持自定义分隔符

–支持正则表达式匹配

–支持自定义变量,数组  a[1]  a[tom]  map(key)

–支持内置变量

•ARGC               命令行参数个数

•ARGV               命令行参数排列

•ENVIRON            支持队列中系统环境变量的使用

•FILENAME           awk浏览的文件名

•FNR                浏览文件的记录数

•FS                 设置输入域分隔符,等价于命令行 -F选项

•NF                 浏览记录的域的个数

•NR                 已读的记录数

•OFS                输出域分隔符

•ORS                输出记录分隔符

•RS                 控制记录分隔符

–支持函数

•print、split、substr、sub、gsub

–支持流程控制语句,类C语言

•if、while、do/while、for、break、continue

例:1.输出以:分割的行打印第一列:awk -F':' '{print $1}' passwd

2.只显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行开始前添加列名: awk -F':' '{print $1 “\t” $7}' passwd

且在所有行开始前添加列名name,shell,在最后一行添加“blue,/bin/nosh”:

awk -F':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7} END{print"blue,/bin/nosh"}' passwd

3.搜索/etc/passwd有root关键字的所有行:

awk  '/root/ { print $0}'   passwd

4.统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容(内置变量:NR,NF):

awk -F':' '{print NR"\t"NF"\t"$0}' passwd

5.用awk做统计:

数据:–Tom  0   2012-12-11      car     3000

–John  1   2013-01-13      bike    1000

–vivi  1   2013-01-18      car     2800

–Tom  0   2013-01-20      car     2500

–John  1   2013-01-28      bike    3500

代码:awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5}} END{for(i in name){print i"\t"name[i]}}' axt.txt

(split($3,date,"-")把第三列已-分割并存入date)

 

6.用户管理

1.用户加入以及密码设置

•useradd cuit01

–passwd cuit01

2.查看用户元数据:id cuit01

3.文件共享(修正属组):

创建目录:mkdir share

创建组:groupadd cuitshare

添加用户到组:usermod -a -G cuitshare cuit01

本来是root持有,让这个组也持有: chown root:cuitshare share

修改权限:基与字符型:chmod ugo +/- rwx share(u用户,g组,o其他人,+加权限,-减权限,r读,w写,x执行,打开)

数值型:(rwx-111一个文件ugo三组权限):chmod 666 cuit01.txt

4.让文件夹被管理员持有:chown -R mysqladmin:root mysql

 

7.安装

1)编译安装

–配置文件:Makefile

–编译,安装命令:make

•案例:编译安装nginx

–下载源码

–tar xf 解压

–vi README (看安装步骤)

–./configure:创建Makefile (./configure --prefix=/opt/cuit/nginx)

出现./configure: error: C compiler cc is not found

安装c语言编译器(yum install gcc -y)

出现./configure: error: the HTTP rewrite module requires the PCRE library.

查询pcre:yum search pcre

下载:yum install pcre-devel

出现:./configure: error: SSL modules require the OpenSSL library.

–make:编译

–make install clean 等

•注意:

–编译环境

–软件依赖

–配置项

2)rpm安装

•rpm安装:

–-rpm ivh  filename(文件名)

•rpm卸载:

–rpm -e PACKAGE_NAME(包的名称,可以查询得出)

•rpm查询 去

–rpm -qa : 查询已经安装的所有包

–rpm -q  PACKAGE_NAME: 查询指定的包是否已经安装

–rpm -qi PACKAGE_NAME: 查询指定包的说明信息

–rpm -ql PACKAGE_NAME: 查询指定包安装后生成的文件列表

–rpm -qc PACEAGE_NEME:查询指定包安装的配置文件

–rpm -qd PACKAGE_NAME: 查询指定包安装的帮助文件

–rpm -q --scripts PACKAGE_NAME: 查询指定包中包含的脚本 

–rpm -qf /path/to/somefile: 查询文件是由哪个rpm包安装生成的 

–如果某rpm包尚未安装,需查询其说明信息、安装以后会生成的文件

•rpm -qpi /PATH/TO/PACKAGE_FILE

•rpm -qpl

3)yum安装

国内镜像:https://opsx.alibaba.com/mirror

(配置)cd /etc/yum.repos.d/

•repo国内源:

–http://mirrors.aliyun.com

–centos-->help

•before:yum install wget

•....

•repo本地目录源:

–mount /dev/cdrom /mnt

–vi /etc/yum.repos.d/local.repo

–[local]

–baseurl=file:///mnt

–gpgcheck=0

–enable=1

•yum命令:

–yum repolist : 显示出所用仓库

–yum clean all

–yum makecache

–yum update

•查询:

–yum list

–yum search

–yum info

•安装&卸载:

–yum install

–remove|erase

 

8.脚本编程

1)自己这个进程执行:source+txt(. +txt):执行文本

不在当前进程执行,子进程执行 :/bin/bash +txt

或在:文件中加#!/bin/bash(脚本本质,还有#!/user/bin/python),输入命令:chmod +x txt,变为可执行,直接./txt执行文件。

2)重定向:cd /proc:进入内核正在运行的进程而抽象成的文件。

cd $$:分配的进程名

cd fd:定向的输出输出流:标准输入流,标准输入流,错误输入流,socket等

可以看到把输入输出流设定bash,格式为: /dev/pts/编号,修改编号即可重定向。

exec 1(输出流)> /dev/pts/定向的编号,即可重定向。

>为重定向符号:如将ls -l显示输入到文件中:ls -l / 1> ls.out

追加到文件中:ls -l/ 1>>ls.out

ls -l /usr /god 1>ls2.out 2>ls3.out(标准输出与报错分开输出到文件)

从左到右执行,ls - l /god /usr 1>ls4.out 2>& 1(or)ls -l /god /usr >& ls5.out (两个输出指到一个文件 )

>输入流,将文本放到标准输入里并赋值,cuit:read cuit 0<<<“txt”(or)read cuit 0<

把文件内容放到流里,cat 0< ooxx.sh

•socket案例

exec 8<> /dev/tcp/www.baidu.com/80

echo -e "GET / HTTP/1.0\n" >& 8

cat <& 8

 

9.变量

•本地:

–当前shell拥有

–生命周期随shell

–name=god

•局部:

–只能local用于函数

–local val=100

•位置:

–$1,$2,${11}(用于脚本函数)

–$#:位置参数个数

–$*:参数列表,双引号引用为一个字符串

–$@:参数列表,双引号引用为单独的字符串

–$$:当前shell的PID:接收者

•$BASHPID:真实

•管道

–$?:上一个命令退出状态

•0:成功

•other:失败

•引用:

–双引号:弱引用,参数扩展

–单引号:强引用,不可嵌套

–花括号扩展不能被引用

–命令执行前删除引用

•命令替换:

–反引号:`ls -l /`

–$(ls -l /)

–可以嵌套

•逻辑判断

–command1 && command2

ls && echo ok(前面一条语句不报错,才执行后面一段语句)

–command1 || command2

•算术表达式

–let  算术运算表达式

•let  C=$A+$B

–$[算术表达式]

•C =$[$A+$B]

–$((算术表达式))

•C=$(($A+$B))

–expr  算术表达式 

•注意:表达式中各操作数及运算符之间要有空格。而且要使用命令引用

•C=`expr $A + $B`

•条件表达式(返回boolean值)

–[  expression  ]

–test expression

–[[ expression ]]

 

练习题:

1.–添加用户

–用户密码同用户名

–静默运行脚本

–避免捕获用户接口

–程序自定义输出

创建脚本:vi addUser.sh

脚本编写:

#!/bin/bash

[ ! $# -eq 1 ] && echo "args error..." && exit 3(判断输入格式是否正确)

id $1 &>/dev/null && echo "user exist..." && exit 5(判断用户是否存在)

useradd $1

echo $1 | passwd --stdin $1 &> /dev/null(&>/dev/null 静默输出)&& echo “user add ok!” && exit 0

获取执行权限:chmod +x addUser.sh

if语句:if ls / &> /dev/null; then echo ok; else echo no ok! ;fi

for循环:for((i=0;i<10;i++));do echo $i ; done(and)for i in cuit01 cuit02 cuit03;do echo $i ; done(空格分割可以用双引号合在一起)

while循环:while ls /god ; do echo ok ; done

 

2.–用户给定路径

–输出文件大小最大的文件

–递归子目录

#!/bin/bash

oldIFS=$IFS

IFS=$'\n'(以空格分割)

for i in `du -a $1 | sort -nr`;do(sort已经做了排序)

if [ -f $(echo $i | awk '{print $2}') ];then

echo $(echo $i | awk '{print $2}')

exit 0

fi

done

IFS=$oldIFS

echo "not find..."

exit 2

 

3.•循环遍历文件每一行:流程控制语句

–定义一个计数器num

–打印num正好是文件行数

(三种方法)

#!/bin/bash

oldIFS=$IFS

IFS=$'\n'

num=0

for i in `cat test.txt`;do

echo $i

((num++))

done

echo num:$num

IFS=$oldIFS

 

 

num=0

lines=`cat test.txt | wc -l`

for((i=1;i<=lines;i++));do

head -$i test.txt | tail -1

((num++))

done

echo num:$num

 

exec 8<&0

exec 0< test.txt

num=0

while read line;do

echo $line

((num++))

done

echo num:$num

exec 0<&8

 

你可能感兴趣的:(linux)