linux shell编程进阶学习

第一节:基础

ls -lh  ——可以用户友好的方式看到文件大小

file 文件名 ——查看文件类型

stat 文件名 ——查看文件当前状态

man 命令/函数名 ——查看详细的帮助文档

man中看某一命令选项的定位技巧  —— 输入/ -n -n前面要有一定的空格

#!/bin/bash

echo “Hello World!”

chmod 777 hello.sh或chmod a+x hello.sh等

./hello.sh执行

echo -e选项用来增强,支持转义字符。

var=world

echo “hello $var \n” ——输出hello world \n

echo -e “hello $var \n” ——输出hello world后有换行

echo -e "\033[32;40mHELLO YOU \033[0m"

——输出不同颜色的字体,以\033[开头,

——\033[0m结尾,3x是前景色,4x是背景色

第二节:变量

set/declare ——查看环境变量

env ——查看环境变量

两者是有区别的,set/declare显示所有的本地变量,env是获取环境变量

unset 变量名 ——取消变量

shell中所有变量都是字符串,变量区分大小写,如foo和Foo是不同的变量;

变量必须以字母或下划线开头;

变量名和值之间没有空格:MSG=Hello √  MSG=  Hello×

只读变量用readonly: readonly MSG=12   MSG=13×

变量引用:echo $var / echo ${var} 后者更加严格

修改环境变量:PATH=$PATH:/bin/opt

永久修改环境变量:vim ~/.bashrc;export PATH=${PATH}:/bin/opt ;source .bashrc

补充:

/etc/profile:

此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.

并从/etc/profile.d目录的配置文件中搜集shell的设置.

/etc/bashrc:

为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

~/.bash_profile:

每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该

文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.

~/.bashrc:

该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该

该文件被读取.

~/.bash_logout:

当每次退出系统(退出bash shell)时,执行该文件.

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.

注意他们之间有执行的优先级;

第三节:重定向

输出重定向

ls -l > dat.txt ——重定向到文件,会创建新文件

ls -l >> dat.txt ——追加到文件末尾

ls -l > /dev/null ——空洞文件

ls xxx > txt  ——文件不存在,则无法重定位,会输出错误信息

ls xxx > txt 2>&1 ——成功,1代表标准输出,2>&1表示2等同于1

输入重定向

cat >> dat.txt <<R   ——表示以R结束!(输入想要的数据后输入R结束)

read var <dat.txt ——将dat.txt中的第一行作为值付给变量var

管道

du -ah | sort -n ——列出一个目录的所有文件,按文件大小排序

ps aux | grep mysql ——查看服务

rpm -qa | grep vsftpd ——查看软件是否已经安装可以使用这个方法

第四节:数学运算

(expr   ()   let)

expr 1 + 2 ——注意要有空格 expr格式要求较高

var=$(expr 1 \* 8) ——*要用转义

TMP=$((1+2)) ——直接使用() 不用空格

let var=3*8

echo $var

计划任务crontab -e进入编辑

第五节:引用

1.双引号:使用双引号可以输出除$、`、\ 以外的任意字符

echo “$hello world” ——输出 world

2.单引号:使用单引号会忽略任何的引用值

hello=10   echo ‘$hello’——输出$hello

3.反引号:用于将系统命令输出到变量

echo `ls` ——相当于执行ls命令

echo “`ls` Hello world” ——执行ls命令后继续打印hello world

4.反斜线:防止shell误解特殊含义的字符

如&  *  +  |  ?   $等等

第六节:grep和正则表达式

1.grep常用 grep -n(显示行号)  -r(递归)   -v(取反)  --color  --include等选项。

grep -nr “Hello” /home /var --include=*.c

2.正则表达式

元字符:[ ]  \  ^  $  . ?  |  *  +  (  )

^  ——匹配行首 ls | grep ^[0-9]以0-9开头的;  ls |grep ^[^A]以非A开头的

$  ——匹配行尾 ls | grep c$以c结尾的, 还可以使用’ ’  ls |grep ‘^[m]c$’

*  ——匹配0次或多次

?  ——匹配0次或1次

.  ——匹配任意单字符

partten\{n\}    ——匹配前面partten出现次数 n为次数

grep --color ‘^[0-9]\{3\}‘ txt

partten\{n,\}    ——匹配前面partten出现次数 n为至少出现次数

grep --color ‘^[0-9]\{1,\}‘ txt

partten\{n,m\}  ——匹配前面partten出现次数 出现次数为n-m之间

grep --color ‘^[0-9]\{1,3\}‘ txt

3.匹配开头和结尾字符

grep ‘^[hello]’ txt ——以hello开头,或grep ‘^hello’ txt

grep ‘hello$’ txt ——以hello结尾的单词

grep ‘^\bHello\b’ txt ——匹配整个单词Hello

第七节:sed命令

-n -p选项

sed  ‘p’ filename  ——查看文件内容 p代表print 注意:会显示两行

sed -n ‘p’ filename ——加上-n 表示只输出模式空间的内容

sed -n ‘1 p’ filename  ——只打印第一行 2 p打印前两行

sed -n ‘1,3 p’ filename  ——打印1-3行

sed -n ‘/main/ p’ file ——打印含有main的行

sed -n ‘/^main/ p’ file ——打印以main开头的行

sed -n ‘/main$/ p’ file ——打印以main结尾的行

sed -n ‘/^[0-9]/\{3\} p’ file——以数字开头 并出现三次

-d选项(delete),与p用法类似:

sed ‘1,3 d’ file ——删除1-3行

-f选项:从文件中读入命令 建立文件cmd.sed 如内容:/main/ p

sed -f cmd.sed  filename

-e选项:后面可以接多个命令

sed -n ‘/main/ p’ -e ‘/hello/ p’  filename

-i重要!

-i选项,会直接操作到文件内容

-s替换:

sed ‘1 s/main/hello/’ filename ——把第一行中main换成hello

sed ‘/main/ s/he/llo/’ filename ——把main所在字符串所在中he换成llo

sed ‘2  /main/ s/he/llo/’ filename ——把第二行且含有main的行中he换成llo

如果没有address-range和partten-range,就会操作到所有行,如

sed  ‘s/main/hello/’ filename ——把所有行中的main换成hello

substitute-flags:

g(global):全局开关   sed  ‘s/main/hello/g’ filename

数字:把每一行第n个符合条件的替换 sed  ‘s/main/hello/2’ filename

第二个出现的main

p:打印,不多说

w(write):输出到文件 sed ‘ s/main/hello/w out.txt’ filename

i(ignore):忽略大小写

各种标记可以联合使用:

sed ‘s/main/fuck/gipw 2.txt’  filename

&:

sed ‘s/main/[&]/’ filename 把每一行main换为[main]

实例:ll > txt

txt中内容如下:

总用量 32

drwxrwxr-x.  7 xxx xxx 4096 10月 18 20:19 install

-rw-rw-r--.  1 xxx xxx 0 12月 18 21:12 txt

drwxr-xr-x.  9 xxx xxx 4096  9月  5 17:22 vim

drwxrwxr-x.  9 xxx xxx 4096 12月 15 21:48 work

我只想要得到txt那一行的21:12

怎么做?

答案:

cat txt | grep txt | sed ‘s/.*\(..:..\).*/\1/g‘

又如echo "hello my world" | sed ‘s/.*\(my\).*/[\1]/‘这样输出:[my]

第八节.AWK命令

awk命令

比较好的参考资料:

http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

格式1:awk -Fs ‘BEGIN{ } / parten/ {action} END{ }’

action中的内容会循环执行 begin与end的内容只会执行一次

awk -F, ‘print $1,$2,$3’ txt ——按逗号分隔成每一个段 打印每一个段

加逗号会输出空格 以方便我们观察

awk -F, ‘print $1 $2 $3’ txt ——这样的会打印出来的没有逗号分隔

也可以不加逗号,加| 、 制表符等等,如下:

awk -F, ‘print $1”|”$2”|”$3’ txt

awk -F, ‘print $1”\t”$2 “\t”$3’ txt

awk -F, ‘/main/ print $1,$2,$3’ txt——匹配含有main的行

awk -F. ‘/txt/ {print $1 "\t" $2}‘ txt——以.作为分隔符。。。

内置变量:

FS内置变量 代表分隔符 OFS代表输出分隔符

awk ‘BEGIN{FS=","; OFS="\t"; printf("===================\n")} {print $1,$2, $3} END{print("===================")}‘ txt

可以指定多个分隔符,如 .  :  %三个

awk ‘BEGIN{FS=[.:%]; OFS="\t"; printf("===================\n")} {print $1,$2, $3} END{print("===================")}‘ txt

指定分隔符并换行RS

文件内容:

101

lvy

BOSS

-

102

XXX

XXX

-

103

QQQ

QQQ

-

要求得到格式如:

lvy:BOSS

XXX:XXX

QQQ:QQQ

答案:

awk ‘BEGIN{FS="\n"; OFS=":"; RS="-\n"} {print $2,$3} END{}‘ txt

输出分隔符ORS

awk ‘BEGIN{FS="\n"; OFS=":"; RS="-\n"; ORS="\n----------\n"} {print $2,$3} END{}‘ txt

用在在每一行执行完毕后输出一些内容。。。

lvy:BOSS

----------

XXX:XXX

----------

QQQ:QQQ

----------

awk中print与printf

print中不需要对变量进行处理,如果是字符串 加双引号

printf与C语言中的用法是一样的。

复习AWK:

awk ‘{print $0}‘ txt ——打印txt中所有行

awk ‘BEGIN{OFS=":";RS="-\n"} {print $2,$3}‘ txt

默认的域分隔符是空格  域分隔符使用-F指定

sudo cat /etc/passwd | awk -F: ‘{print $1}‘ ——冒号作为域分隔符

对比sudo cat /etc/passwd | awk ‘{print $1}‘看看

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

awk  -F ‘:‘  ‘{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}‘ /etc/passwd

awk ‘BEGIN{print("Hello"); FS=".";} {print FILENAME, NR, $2} END{print("World!")}‘ txt

FILENAME代表文件名;NR代表行号;NF代表列数 $NF可以取最后列

自定义变量:

必须以字符开始,不能使用内置变量,最好放在begin段中

awk  -f  xxx.awk  file ——  -f选项指定可以在后面接一个awk脚本。

必须是下面这种形式 BEGIN{要放在一行

BEGIN{

total=0;

}

{

total += 1;

}

END{

print “total is :”, total;

}

一元运算符:+返回数字本身  - 改变数字的符号   ++递增操作

算术运算符:+ - * /

字符串连接:str = str1”__”str2; 可以连接

比较/逻辑运算符:>  >=  <  <=  &&  || 等

正则表达式:~匹配   !~不匹配

实例:统计/etc/passwd下有多少用户使用/bin/bash

cat /etc/passwd | awk -F: ‘BEGIN{NUM=0;} /\/bin\/bash/ {print $NF; NUM++;} END{print "The number who use /bin/bash is:", NUM}‘

AWK条件与循环:

与c语言一样,awk中也有条件、循环语句

例子:awk -F, ‘{if ($3 == 500) print $1; else print “Not Found!”;}’ /etc/passwd

第九节.shell环境

变量别名:shell中输入alias ll=”ls -l”

如果想退出终端后还有效的话 就写入~/.bashrc

stty -echo ——设置输出不回显 可以再输入密码时,设置。

stty echo  ——回显

cal ——查看日历

cal [[day][month]year]  [代表是可选的]  cal 7 2014表示查看2014年7月份

data ——查看时间

date “+%A” 查看星期几

date "+%Y-%m-%d %H:%M:%S" ——显示2014-12-26 21:06:29

find命令补充:find [option] [-exec | -ok] command {} \;

-exec、-ok选项  -exec是不安全的,-ok是安全的

find /home -name test.txt -exec rm {} \; ——找到后会立刻删除,不会提示

find . -name aaa -ok rm {} \; ——会提示是否删除

find . -name aaa -exec cp {} /home \;

-xargs选项

find . -name aaa | xargs rm

find . -name aaa | xargs -i mv {} /opt

实例:查找当前目录下非.c的文件 并进行删除:

find . -type f ! -name *.c | xargs rm -f  ——注意感叹号的位置

第十节.shell脚本编程

shell条件语句:

if list then

do something here

elif list then

do another thing here

else

do something else here

fi

EX1:

#!/bin/sh

SYSTEM=`uname -s`        #获取操作系统类型

if [ $SYSTEM = "Linux" ] ; then     #如果是linux的话打印linux字符串 注意[]中两边的空格

echo "Linux"

elif [ $SYSTEM = "FreeBSD" ] ; then

echo "FreeBSD"

elif [ $SYSTEM = "Solaris" ] ; then

echo "Solaris"

else

echo "What?"

fi     #ifend

基本上和其他脚本语言一样。没有太大区别。不过值得注意的是。[]里面的条件判断。

1 字符串判断

str1 = str2      当两个串有相同内容、长度时为真

str1 != str2      当串str1和str2不等时为真

-n str1        当串的长度大于0时为真(串非空)

-z str1        当串的长度为0时为真(空串)

str1           当串str1为非空时为真

2 数字的判断

int1 -eq int2    两数相等为真

int1 -ne int2    两数不等为真

int1 -gt int2    int1大于int2为真

int1 -ge int2    int1大于等于int2为真

int1 -lt int2    int1小于int2为真

int1 -le int2    int1小于等于int2为真

3 文件的判断

-r file     用户可读为真

-w file     用户可写为真

-x file     用户可执行为真

-f file     文件为正规文件为真

-d file     文件为目录为真

-c file     文件为字符特殊文件为真

-b file     文件为块特殊文件为真

-s file     文件大小非0时为真

-t file     当文件描述符(默认为1)指定的设备为终端时为真

3 复杂逻辑判断

-a         与

-o        或

!        非

一些预定义的变量:

#echo $# 表示位置参数的变量

#echo $* 表示位置参数的内容

#echo $? 表示命令执行后返回的状态,用于检查一个命令的执行是否正确;在Linux中,命令退出状态为0表示命令正确执行,任何非0值表示命令执行错误

#echo $$ 表示当前进程的进程号

#echo $! 表示后台运行的最后一个进程号

#echo $0 表示当前执行的进程名

参考资料:

http://www.cnblogs.com/xuqiang/archive/2011/04/27/2031034.html

时间: 2024-08-08 20:46:05

linux shell编程进阶学习的相关文章

“Linux Shell编程”视频学习笔记

一.Linux Shell基础编程 视频1 1.1.查看你系统shell信息 $ cat /etc/shell 命令可以获取Linux系统里面有多少种shell程序 $ echo $SHELL 命令可以查看当前你所使用的shell是哪一个 1.2.查看文件信息,ls $ ls -l 查看文件信息:文件类型.文件权限.文件硬链接数.文件所属用户.文件所属组.文件大小.文件最近修改时间.文件名 1.3.改变文件权限,chmod 只有root用户或者文件的所有者能改变文件的权限 例子:$ chmod

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

Linux shell脚本基础学习详细介绍(完整版)二

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

Linux Shell编程之二选择结构

Shell编程学习之二 一.bash的条件测试 测试方法或者说测试书写: test EXPR [ EXPR ] [[ EXPR ]] 例如:测试变量 User_Name 的之是否为root test $User_Name="root" [ $User_Name == "root" ] [[ $User_Name == "root" ] 根据比较时操作数的类型,测试类型分为: 测试类型 运算符 运算符所代表的意义 示例 整形测试 -gt -lt -

shell编程进阶

Shell编程进阶 Shell结构以及执行 [[email protected] ~]# mkdir shell [[email protected] ~]# cd shell/ [[email protected] shell]# vim first.sh #!/bin/bash ##The first test shell script ##written by wangchao ls /tmp/ echo "This is the first script." [[email p

linux 网络编程需要学习的内容

Linux C++培训发 课程模块 Linux C++全科班课程由以下模块组成: Module01 - Linux系统基础 由于本系列课程基于Linux(或UNIX),熟悉Linux操作系统是必要的前提. 该模块的课程包含以下方面的内容: 常用Unix/Linux命令熟悉文件管理.文本处理.进程管理.网络.系统管理等各个方面大约100个常用的命令. 深入了解bash了解Linux默认shell: bash 的语法.命令执行.I/O重定向.任务控制等. 正则表达式基础由于UNIX/Linux中很多

linux应用编程基础学习笔记

********************************************************            --文件I/O-- 文件:文本文件:存储量大,速度慢,便于字符操作二进制文件:存储量小,速度快,便于存放中间结果 普通文件:设备文件: ---C标准函数---:Buffered I/O,高级文件系统,在用户空间开辟缓冲区,流操作(stream)#include<stdio.h> typedef struct{ int _fd;      //文件号 int _

京峰Linux Shell编程从入门到精通

课程介绍:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. -------------------课程目录------------------- <Shell编程从入门到精通> ├1.linux下shell编程基础入门_(new).mp4├2.Shell编程之变量及LAMP导航菜单编写_(new).mp4├3.Shell编程之IF条件语句各种案例演练_(new).mp4├4.使用if条件语句编写MySQL备份脚本_(new).mp4

Linux网络编程一站式学习

提要 学过很多遍计算机网络,依然不会网络编程. 看完这篇文章之后就不会是这样了. 环境:Ubuntu14.04 64bit 何为Socket 是基于TCP/IP的网络应用编程中使用的有关数据通信的概念,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务.Socket正如其英文原意那样,像一个多孔插座.一台主机犹如布满各种插座的