Linux 学习笔记 五

在douban.fm中有一点就是你永远也不会有可能上一曲,这也就是像生活中的我们一样,过了就是过了,你永远也是没有机会后悔后退的,过去了就只能下一曲,继续往前走

那么如果我是两个相关的指令,第一个 command1 如果执行结果有错误,第二个就不被执行,可以这样做吗?当然可以

command1 && command2

command1 || command2

[test @test test]# ls -al 1> list.txt 2> list.err

将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err

[test @test test]# ls -al 1> list.txt 2>&1

将显示的数据,不论正确或错误均输出到 list.txt 当中!

/dev/null 代表空NULL

eg  find / -name testing 1>list_right 2>list_error

last  可以查看这个月的登录数据

tee 可以在查看了数据并把数据送出给下一个管道的时候还显示在屏幕上

 

tr [-ds] SET1

-d:删除SET1这个字符串

-s:   取代掉重复的字符

 

EG: cat list_right|tr -d testing

 

split

-l 以行数来分

eg:split -l 5 /etc/passwd test

会被分成五个

 

正规表示式 ( Regular Expression, 底下简称 RE )

 

grep [-acinv] ‘搜寻字符串’ filename

参数说明:

-a :将 binary 档案以 text 档案的方式搜寻数据

-c :计算找到 ‘搜寻字符串’ 的次数

-i :忽略大小写的不同,所以大小写视为相同

-n :顺便输出行号

-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!

 

宣告变量内容

[test @test test]# declare [-afirx]

参数说明:

-a  :定义为数组 array

-f  :定义为函数 function

-i  :定义为整数 integer

-r  :定义为『只读』

-x  :定义为透过环境输出变量

eg:

[test @test test]# declare -i a=3

[test @test test]# declare -i b=5

[test @test test]# declare -i c=$a*$b

[test @test test]# echo $c

15

 

myscript opt1 opt2 opt3

 

$0 myscript 也就是代表script这个档案

$1 opt1 代表是第一个附加参数,

$2 opt2  代表是第二个附加参数

也就是说script可以带参数运行

eg:

./sh pa1 pa2

则在sh的script里面取$1则是 pa1 $2则是 pa2 $0则是script本身

 

 

for (( 条件一; 条件二; 条件三 ))

for variable in variable1 variable2 …..

while [ condition1 ] && { || } [ condition2 ] …

until [ condition1 ] && { || } [ condition2 ] …

for 是已经知道有多少个 run 了,即是已经知道要跑几次了,至于 until 与 while 则分别是:

『until:直到条件相同的时候才离开程序』;

『while:当条件相同的时候,就继续做!』

 

记住在使用if 时 条件里面的都要使用空格间隔,不然条件将是无效的。

可以使用以下测试script测试脚本的执行情况

[test @test test]# sh [-nvx] scripts

-n :不要执行 scripts ,查询 scripts 内的语法,若有错误则予以列出!

-v :在执行 scripts 之前,先将 scripts 的内容显示在屏幕上;

-x :将有使用到的 scripts 内容显示在屏幕上,与 -v 稍微不同!

 

at : 这个工作仅执行一次就从 Linux 系统中的排程中取消;

crontab : 这个工作将持续例行性的作下去!

 

只要你编辑完 /etc/crontab 这个档案,并且将他储存之后,呵呵!那么 crontab 的设定就自动的会来执行了!

linux系统启动过程

第一阶段:

Boot loader(lilo或grub),内核启动前的一段引导程序,主要做三件事:

1.初始化芯片(最直接理解为CPU)

2.根据系统设置,初始化少量的外围设备(例如从U盘启动)

3.启动选择器(针对多操作系统),加载linux内核

 

 

第二阶段:

linux内核启动阶段

1.首先挂载initrd文件,形成我们linux的最小根文件系统(在内核的启动过程中,需要文件系统,而实际上的文件系统存在于硬盘上,linux解决这个问题的办法是,先挂载产生一个最小文件系统initrd,把它装入内存,然后以这个文件系统为依托,去读取完整的文件系统)

2.执行/sbin/init这个文件,产生1号进程(父进程是0号进程:内核)。

执行这一步非常重要,它生成1号进程后,大多数版本的linux内核都会利用1号进程直接或间接的产生其他进程。  而有些内核同时产生出2号进程,不同版本作用不一,我们这个内核2号进程作用是(在用户层面上)管理内存分页。

 

第三阶段:

1.execute /etc/init.d/*   执行/etc/init.d/目录下所有的程序

2.execute /sbin/getty     用来初始化标准输入输出标准错误,0,1,2

然后执行/bin/login,产生出登录界面

3.manger the orphen process管理孤儿进程(操作系统运行中一直都运行)

Linux 学习笔记 四

SHELL  编程

 

给你权限越高,就越危险,操作就越是要谨慎。

Shell 是一个用C语言编写的程序,是用户使用Linux的桥梁

Shll程序设计语言:编写SHELL脚本,用户系统管理工作

命令语言:交互解释和执行用户输入命令

种类:

Bourne shell (sh  bash)

C shell (csh tcsh)

Korn shell (ksh)

Shell命令的两种形式

内部命令: cd echo     实现功能比较简单,代码量比较少,占用资源少

外部命令: cp rm 实现功能比较复杂

查看命令类型 type command

系统加电–>

 

初始化文件

登录shell

交互式非登录shell   比如通过命令shell

非交互式shell

 

登录shell

首先登录shell 执行 /etc/profile  系统级配置文件

~/.bash_profile      ~/.bash_login       ~/.profile 执行用户配置文件,只要其中               之一一个被执行了,其余的就不执行了。

~/.bash_logout 退出时执行。

交互式非登录shell

我们使用的终端就是shell

并不执行登录shell 里面的文件,但是继承了登录shell,所以也就是相当于全部都执        行了

/etc/bashrc

~/.bashrc       改此文件可以修改我们的看见的终端的命令行的那提示符                                        ~/emsd1302/0715-0719/day05$

想改的内容:PS1=”youname”

 

非交互式shell

并不执行前面描述的初始化文件中的命令,继承了登录shell设置的shell变量

查找环境变量env, 并执行有该变量命名文件中的命令 eg:写一条脚本  然后执行                     bash first.sh  这样我们就执行了一个bash然后就退出了。这也就是说执行                   了之后就死掉了

shell 编程

只有弱类型,如字符型

局部变量:只在当前shell中存在的变量,而由其它的shell启动的程序不能使用该变                      量 新开一个终端是没用的,启动一个子shell也是没用的

环境变量:shell的任何子进程都能访问的变量,许多程序要正确运行都需要使用环境变                       量

shell变量:shell设置的特殊变量,也是shell正确运行所必须的

定义用户变量

变量名=变量值 var=hello

可包含、“字母”、”下划线“、”数字“ 以字母和数字开头 数字打头为shell默认                  使用

unset 释放变量,清楚变量

set 查看所有变量

readonly 制定变量为只读,unset不能释放

环境变量

一般用大写字母作为环境变量

系统设置像ls这样的命令一样,我们可以使用ls就是因为环境变量配置好了,如果不配        置好我们就得使用绝对路径看

shell 变量

例如 $$ 系统已经设置好了的。

 

环境变量设置

加上export 把其设置为环境变量   定义的是用户级别的      在另外一个shell也是可以查看的

可以用env查看所有的环境变量 清楚用unset

常用环境变量

HOME: 保存注册目录

PATH:保存用冒号分隔的目录路径名

TERM:终端了行Xterm 图形终端 linux 文本终端

UID:当前用户的标识符,取值是由数字构成的字符串

PWD:当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化

PS1:主提示符,# $

PS2:辅助提示符,在输入行末尾“\”输出该提示符 echo $PS2  =  >

IFS:shell制定的缺省域分隔符(默认是空格) IFS=:

LOGNAME:此变量保存用户登录名

SHELL:保存缺省的SHELL

RANDOM:产生随机数  产生的随机数在一定的范围

RANDOM(max-min+1)+min

Eg:echo $(($RANDOM%(10-1+1)+1))

bash 支持一维数组

var=(element1 element2…… elementn)

var=([2]=element3 [0]=element1)  对数组进行赋值进行修改

eg:array=([5]=change5 [2]=change2) 这样就只剩下两个元素了

var [2]=element3 修改指定数组变量的值 eg:array[5]=change

 

使用数组${name[n/*]}  eg:echo ${array[4]} 指定显示某一个

echo ${name[*]} 显示所有元素

echo ${#name[*]} 显示元素个数

echo ${name[@]} 和*基本一样 在使用echo ${array[*]}上

但是在整体赋值上array1=(“${array[*]}”)

array1=(“${array[*]}”) 赋值之后 array1的长度就是 1

array2=(“${array[@]}”)  赋值之后还是原来的长度

变量替换

文件名替换

变量替换

命令替换

算术替换

 

变量/参数 替换格式

变量=${参数:-word}——若参数为空或者未设置,用word代替参数进行替换,参数值不变

eg:

#!/bin/bash

#var1=hello

VAR=${var1:-“hello word”}

echo “The value of VAR is $VAR”

echo “The value of var $var1″

echo finished

变量=${参数:=word}——若参数为空或者未设置,用word代替参数进行替换,参数值为word

eg:

#!/bin/bash

#var1=hello

VAR=${var1:=”hello word”}

echo “The value of VAR is $var1”

echo “The value of var $VAR”

变量=${参数:? message}——若参数为空或者未设置,则message作为标准错误打印出来

eg:

#!/bin/bash

#var1=hello

VAR=${var1:?”hello word”}

echo “The value of VAR is $var1”

echo “The value of var $VAR”

变量=${参数:+word}——若参数设置了,用word代替参数进行替换,参数值不变

eg:

#!/bin/bash

var1=hello

VAR=${var1:+”hello word”}

echo “The value of VAR is $var1”

echo “The value of var $VAR”

 

查询匹配字符

* 匹配一个或者多个

? 匹配一个

[char] eg:[1-9] 匹配一个范围

eg:[!a]       显示不含a的文件

 

Linux 学习笔记 三

Finding Things on Linux

 

ID、显示跟用户相关的信息

id

id root

id -a root

w

who

查找

find + 路径 + 参数 + 参数内容

find . -mtime 10 -print  查找最后修改时间你=

 

atime 访问时间   acess

ctime 创建时间  create

mtime 最后修改时间          modification

+10 10天之前

-10  100天之内

 

find . -mtime 10 -print

find /etc -user 0 -size +400 -print              查找用户0 大小为400的快

 

 

查看当前系统的数据块的大小

df -l

sudo tune2fs -l /dev/sda1

 

-size +n 大小于N块

-n小于n块

-nc 大于n个字节

-nk 大于nk的文件

find ./ -name “*.txt”   查找当前目录下名字以.txt 结尾的文件

目录在linux中默认的大小是4096个字节

 

find ~ -perm 777 > ~/holes      查找家目录下 权限为777的文件 并重定向到~/holes

find /export/home -type f -atime +365 -exec rm {} \;    查找 /export/home 下类型为普通文件的,且最后访问时间在一年以上的文件 并把其删除掉  -exec 表示执行后面的操作

 

 

find . -type f -size 0c  -exec rm {} \; 表示删除当前目录下大小为0个字节的文件

 

find /export/home/html -name “*.html” -print | xargs\

perl -p -i.bak -e “s/Copyright 2004/Copyright 2005/g;”

 

查找/export/home/html 下后最为html的名字的文件打印列表 | 把前面的输出取到         xargsperl 把前面查找到的内容一个一个的交给后面的去处理  替换…2004 为..2005

 

-maxdpth 最大深度(目录)

mkdir -p dir1/dir2      eg:find ./ -maxdepth 1 -name “*.txt” 查找一级

 

grep 查找文件内容

大小写敏感

grep root /etc/passwd  查找有root关键字的行内容,以行为单位

-v反向 查找除了root以外的

-i 忽略大小写

 

ls -al |grep -i ‘sep 1’ 查找显示的文件的 含有sep1的文件

 

wc 显示行数词数字符数的统计

wc -l     统计行数

-w   统计词

-c    统计字符

grep wang /etc/passwd | wc -l 统计包行wang这个单词的行数

 

grep ‘/bin/bash’ /etc/passwd |wc -l  统计使用bash的用户数

grep ‘/bin/bash’ /etc/passwd | awk -F: ‘{print $1}’ | cat > ./bash.log

 

(grep ‘/bin/bash’ /etc/passwd | awk -F: ‘{print $1}’;date) | cat >     ./bash.log

查找使用bash 的用户,并把用户名写入bash.log文件里面,并追加时间戳

 

 

du 命令 统计磁盘的使用情况

du filename

du -sk

-s 信息汇总起来

-k 以K为大小来统计

 

df 查看分区挂载信息

df -k 以K 为大小查看 默认是字节

 

ps 命令 查看当前系统中正在运行的进程

ps -e 所有的进程全部显示出来

-f 显示显示的信息

-u 显示用户的uid

ps    -ef | grep telnet 过滤含有telnet的进程信息

UID 代表用户

PID 代表进程ID 唯一代表一个进程

PPID 父进程ID  1代表init进程 没有父进程就是孤儿进程,1号进程就是孤儿进程的父进程犹            如孤儿院院长,

tty 代表在哪一个终端被启动,有问号代表内核启动

TIME 代表当前运行持续的时间

 

kill 命令杀死进程,很多情况用来发信号,进程和进程之间利用信号来交流信息

kill -9 1232  9号信号代表终结进程

pkill sleep

 

sleep 睡眠命令

sleep 100 休眠100秒

sleep 100 &表示退到后台运行

 

 

job control 任务调度

前后太调度

sleep 100 &

jobs

fg %n 把一个任务调度到前台

bg %n 把一个任务调度到后台

stop %n挂起

kill %n

 

网络相命令

ping -s hostIP

ifconfig 查看linux下的IP 配置

netstat -rn 显示网络状态

traceroute     www.sina.com.cn              显示网络经过了多少级路由

 

远程登录命令

telnet hostnameIP 远程登录 在远程主机上只要符合posix标准的命令的都可以执行

rlogin

ssh  登录是通过密码加密的传输的,telnet 是明文的

 

FTP是一种文件共享机制,

ftp 219.225.211.200

cd 用来修改服务器当前命令

lcd 修改本机命令

dir 显示SERVER的目录信息

pwd 也是显示服务器路径

bye 退出 或者使用exit 退出

!clear 清屏

! 加!表示接下来的命令在本机执行 但是对于cd不起作用,应为其为内部名,!只使用与外部              命令。外部命令:写成程序,可被发现的命令。、内部命令:是通过文件变量来实现的。

bin 用于制定FTP 传输方式 一般分为两种

bin二进制形式 10 → 1010

asc文本形式 10 → ‘1’ ‘0’

上传,下载

get 下载,单个文件下载

put 上传,当个文件上传

mget      多个文件下载

mput      多个文件上传

hash 加密  以#的形式显示

prompt 命令提示功能

 

write 发送信息 一对一  只支持一台主机多个用户发送信息

mesg -y|-n 是否接收别人的信息

wall 广播式

 

eg: telnet hostIP

write contents pts/hostpts

 

 

 

 

 

script 脚本

#!/bin/sh

pwd

cal

date

 

crontab 计划任务

-l 列出已存在的计划任务

-e 编辑计划任务 –>选择一个文本编辑器 select -editor

-r 清空计划任务列表

m    分(0-59)

h     时(0-23)

dom       日(1-31)

mon       月(1-12)

dow       星期(1-7)

command     执行的命令

 

特殊的符号

*   满足任意条件

–      区间      9-17

,   或0,20,40

/   每隔多久时间  有些不支持

02***/tmp/a.txt每天凌晨亮点执行a.txt

13 5 13 * 5 /tmp/a.txt       每月的13日的5:13分执行,有冲突时任意满足一个也执行

0,30 8-17**1-5/tmp/a.txt      八点到17点每隔半个小时 周一到周五 执行

 

设置初始文件

修改环境变量

PATH=/

%WTO=uname -n   把里面的命令的执行结果付给WTO

whereis  会查看所有与之相关的信息

history 记录你敲过的所有命令

history 5       记录最近敲的几条

!!        重复执行前一条命令

!n        重复执行在history里面的第几条

alias h=history 表示定义h为history的简写

unalias   撤销

 

umask    文件创建权限掩码

普通文件     666-umask=实际权限

目录文件     777-umask=实际权限

t 权限位      粘着位     用来当你对一个目录+t权限时。此目录下的文件只能由三类人删除

1.root

2.目录拥有者

3.文件拥有者

粘着位为     1777      rwxrwxrw t

s位        2777 rwxrwsrwx

s位        4777 rwxrwxrwx

PS1=表示修改一个环境变量

PS1=’${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ‘

注意修改对。PS1有多行

\u用户名

\h 计算机名

\w当前工作路径  W显示最后一级路径

\$表示用户级别

 

source + 配置文件    表示重新加载配置文件

 

用户组管理

groupadd -g GID 制定的GID的值

groups 查看当前用户所属的组

groupdel       删除组

groupmod 修改组信息

-n 修改组名

-g 修改组ID

gpasswd

-a +用户名+ 组名  向指定组添加用户

-d+用户名+组名       删除用户

 

用户管理

useradd [参数] username

-u 指定用户的UID

-g 制定所属的组,如果不指定则添加到默认当前用户所属的组

-d 指定用户的主目录

-s 指定用户的SHELL类型

-m 建立用户主目录 不存在则自动创建

每个用户有一个默认的组。创建用户后,默认是没有密码的,这样也就是没有注册用户,这时需要添加密码。Sudo passwd student    其中在修改密码时sudo passwd 是修改root密码,passwd 是修改当前用户密码 sudo passwd user 是修改制定用户密码

 

usermod [] 用户名

-l 修改用户名  sudo usermod -l zhangsan student

-d 修改用户主目录

userdel

-r 删除用户主目录

chown [] +用户名+文件名            修改文件拥有者,文件过户只能由root进行

sudo chown student a.txt

chown -R 递归改变

sudo chown -R student dir2

chgrp [] 组名 文件名 同样需要root权限过户

sudo chgrp emsd1302 dir2

-R 递归修改

sudo chown -R student:student dir  表示同时修改所属用户和组别同样需要                   root权限执行

 

30 17 18 7 * /home/arts/emsd1302/0715-0719/day04/findtest/a.sh

linux 学习笔记 二

ln命令 主要用于产生命令,创建链接

ls -s source_file destination

创建硬链接

ln file1 file2

当对某个文件创建硬链接时,硬链接数会增加

ls -l -rw-rw-r– 2 arts arts 15 717 09:59 a.txt

-rw-rw-r– 2 arts arts 15 717 09:59 a.txt.hln

不占空间

不可以跨文件系统进行链接

不可以对目录进行了链接

何时被释放? 软链接,当文件被删除时释放。硬链接数为0的时候真正释放数据块

创建软链接

ln -s file1 file2 -s表示创建的是软链接soft

需占用空间来存放路径信息

软链接操作的时候保存的是一个路径信息。

可以跨文件系统进行链接

man 、–help info命令查看帮助手册

man name

spacebar 空格。滚动一屏幕

return 回车

q 退出

/string 搜索

n

man -k keyword 检索关键字

ls –help 查看简单的帮助信息

info

 

匹配符

ls d* * 匹配零个或者多个字符

ls d? 匹配一个字符

ls [b-f]b* 匹配一个集合或者和一个连续的字符

;用于分隔多个命令

date 显示时间

cal 日历

lp 打印

> 重定向,一般是把文本内容放到文件里面去 ↔

 

>> 输出重定向追加类型、2> 错误重定向,标准错误输出、> 输出重定向、 < 输入重定向

 

cat 无参数时,标准输入–>标准输入

cat > file 表示修改cat输出的定向,定向到文件

cat <file 表示标准输入定向到文件里面,不改变标准输入,把文件输出到标准输出

cat < file1 >file2 file1文件里的内容放到fiel2里面去。

cat /etc/passwd;ls -l /etc/;ln /etc/./etc.ln 2> err.log

more 命令

用于显示信息,一次显示一屏

词典:goldendic 附加词库即可用

Text Operating

cat 命令

cat /dev/null > ./a.txt null : 空洞 所以次操作表示清空a.txt里面的内容

zero:填充0

 

awk -F:'{print $1 “\t” $6}’ | sort >

awk -F 以后面的符号来分割内容,也就是冒号,后面表示打印第一项,和第六项的内容,

 

\

1、表示赚义字符

2、表示续行字符,续行后不能跟空格,需要直接加回车

\+空格 = 空格

 

sort 排序

 

cat a.txt | awk -F\ ‘{print $1 “\t” $3}’

 

head tail 显示前10或者后10行命令

head -n filename 显示前n

tail -n filename 显示末尾n

 

uniq 命令 跳过重复的行,但是不改变源文件

uniq filename

 

diff 比较两个文件的不同之处,然后以列表的形式显示

a.txta a b a a

b.txta a a a a

diff a.tx b.txt

>

3c3 表示第三行change c:表示改变 a:表示增加 d:表示缺少

< b 表示地一个文件为b

分隔两个文件

> a 表示第二个文件为a

diff -u 表示合并模式 diff -u a.txt b.txt 表示a.txt 为主体 b.txt 为客体

— a.txt 2013-07-17 14:24:14.485963439 +0800

+++ b.txt 2013-07-17 14:24:39.537962699 +0800

@@ -1,5 +1,5 @@

a

a

-b

+a

a

a

 

echo 命令 拷贝任意所输入到命令行的东西

echo -option message

eho “hellp word“

echo -e “hello \t word” —识别转义字符

echo –n “hello word” —跳过输出换行

script 记录所有的或者一部分的会话,包括你的输入和系统的回应

script -a filename

 

()使用小括号封装成小SHELL 命令

(head /etc/passwd;tail /etc/passwd) | awk -F: ‘{print $1 “\t” $3}’|cat > ./userinfo1

 

小括号里面的命令会被有限执行,输出结果被当作一个整体使用。

VI文本编辑器

命令模式

命令模式

输入模式

vi filename open or createa file

vi

i:在光标当前位置前插入

a:在光标所在位置后插入

o:在光标所在行下插入一空行

O:上一行起一个空行

I:自动跳到行首

A:自动跳到行尾

删除

x:删除一个字符

dw:删除一个词

u:撤销

3dw:删除三个次

dd:删除一个行

2dd:删除两个行 ndd

:5,10d:在命令行模式下执行,删除第五行到第十行内容

替换

r:替换一个字符

cw:替换一个单词先删除,自动进入插入模式

cc:替换一行

C:替换从光标到行尾

复制和拷贝

yw 拷贝词

yy 拷贝行

p 当前行粘贴

3yw 复制多行

:120co3 拷贝行120在行3之后

:34移动行3到行5在行6之后

撤销

u undo

ctrl +r

设置行号

:set nu

保存文件

w 存盘

w newfile 存成新文件

wq 存盘退出vi

:q! 强制退出

shift zz 自动保存退出

简单操作

~改变大小写

J 把当前行和下一行连起来

u 废除刚才的编辑操作

:set nu 显示行号永久显示行号需要修改配置文件 vi ~/.vimrc

21光标停在21

21G/gg光标停在制定行(gg,G文件尾)

50zz 跳一半空的上来

shift + G 到行尾 ,gg 直接跳到行首

ctrl +f 跳转一页

ctrl +b 上一页

w(web) 下一个词的词首

e 下一个次的词尾

b 上一个词

查找

/从当前行向下查找

?从当前行向上查找

n 查找继续

nohl 取消高亮

r /etc/passwd 在光标位置插入另外一个文件 必须与可读权限

l,$s/旧串/新串/g 替换全文

$ 表示末尾行

% 表示全文

VI 可视模式——类似鼠标框选

字符 v 命令模式进入

V 命令模式进入

VI 分栏模式

水平 :split finame vp

垂直: vsplit finame vs

ctrl +ww 切换分栏

ctrl +w 加方向键

:wqa 保存全部并退出

:qa!全部强制退出

 

gcc编译

附注: 使用 -std=c99 -std=gnu99 来编译您的代码

1 13 14 15 16 17 20