linux course from linux foundation 学习记录

linux foundation 提供了一个不错的在线linux教程,里面介绍了linux很多基本的概念,历史,操作和使用习惯等知识。

使用文件描述法进行重定向:

some_exc > file 2 >& 1

另外一个简写是:

some_exc &> file

这样会将stdoutstderr都写入到文件中。

使用whichwhereis来定位可执行程序,更推荐whereis搜索范围更加大,which只在当前用户目录中搜索。

使用locate命令可以搜索文件,但是该文件使用updatedb进行构建,不是实时的。

使用find命令更加灵活。

显示当前目录所有文件:

find dire

搜索文件名:

find dire -name "*.tmp"

运行命令

find dire -name "*.tmp" -exec rm {} \;

或者使用 ';'形式作为结尾(应该是正常的;表示命令的分割符号,而不是find命令的执行结束符号,所以需要转义,两种形式都可以)

find dire -name "*.tmp" -exec rm {} ';'

使用-ok用来用户确认之后再操作

find dire -name "*.tmp" -ok rm {} \;

Debian系统中使用 apt系列 (advanced packaging tool)命令进行包管理,而在Fedora中使用yum命令(yellowdog updater modifier)。

压缩,解压缩命令:

  • gzip, gunzip (gzip -d)是对文件进行操作,即使使用 -r参数对文件夹进行操作,也是对文件夹下面的单个文件进行操作。
  • bzip2,bunzip2 也一样,对文件进行操作。
  • zip 是对包进行操作,和tar命令类似,需要先指定输出名称,再指定输入文件filter。
  • tar命令可以使用 -C 来改变输入或者输出的目录。这样可以将解压出来的文件放入到特定目录中。

通过mount命令可以将设备加入到当前文件系统中,默认的mount配置在/etc/fstab (file system table)

/proc目录叫做 「pseudo filesystem」,因为这里是内存数据的映射。

使用sudo /usr/sbin/useradd加入一个用户。

使用 chmod来改变文件的读写权限,权限分为:

  1. u 用户
  2. g 群
  3. o 其余的人(所有人)

比如下面方式:

chmod uo+x,g-w xxx-file

简写的形式是编码的权限:

  1. r 是4
  2. w 是2
  3. x 是1

rwx 对应7 rw 对应6

简写的方式:

chmod 766 xxx-file

使用chown改变一个文件的文件拥有者。chgrp改变文件的group内容。

chown new-user file
chgrp new-group file

使用 cat << EOF > a.txt 可以输入多行数据到文件中,使用EOF结尾。

last命令可以查看最后登陆系统的用户信息。

用户可以执行的sudo命令是可以控制权限的,在文件 /etc/sudoers进行设置,使用 visudo 进行编辑可以获得更好的安全保证。

网络工具:

  1. 使用host查看域名的ip地址,默认使用/etc/resolv.conf中配置进行DNS解析。
  2. 使用route查看路由表
  3. 使用traceroute查看到一个目的地的路由表
  4. 使用nmap进行端口扫描
  5. 使用wget下载网页
  6. 使用curlwget更加方便,可以直接答应出url对应内容,也可以下载文件。

文本编辑工具:

sedstream editor的简称。

比如替换字符串:

sed s/abc/def/g file1 > file2

awk用来提取文件中特定pattern的信息,名称是由三个发明者的last name的首字母构成。

awk对于分析表格数据很在行,比如得到/etc/passwd中的用户名:

# -F set delimiters
awk -F : '{ print $1 }' /etc/passwd

文件操作命令:

  1. sort/uniq 排序和消重。sort -u file 就等于 sort file | uniq

  2. paste将多个文件使用分隔符号合并

    # file1和file2的对应行连接一行,并使用tab分割
    paste -d '\t' file1 file2

    # file1的所有行变为一行,并使用':'分割
    paste -d ':' -s file1
  3. join命令可以将有相同列信息的数据进行合并(类似于多个表有相同的key,根据key合并数据)

  4. tee命令见输入一方面输出到文件,另外一方面输出到标准输出中。

  5. cut也可以得到分割之后的的特定列:

    # 得到第一列
    cut -d ':' -f 1 /etc/passwd
  6. strings命令用来得到一个文本中可读文本

    strings xxx.xls | grep xxx

pdftk是对pdf进行操作的非常好用的工具,可以进行分割,合并,提取文件等操作,pdfinfo可以提取pdf文件内容。

系统命令的返回值记录在环境变量?中,也就是可以得到上一次返回值:

echo $?

使用shift可以将当前输入参数的第一个去掉,所以执行特定命令次数可以写成

run() {
number=$1
shift
for i in `seq $number`; do
$@
done
}

使用$@表示后面所有的参数和$*是一个含义。

使用ls方式或者$(ls)方式得到命令的结果。

if的语法为:

if condition; then do-something; fi

if condition; then
do-something
else
do-xxx
fi

if的判断使用[]包裹起来

if [ -e xxx-file ]; then
echo xxx-file exist!
fi

使用-e判断文件是否存在,-f判断是否是普通文件,-d判断是否是目录。

bash中执行数学运算,有三中方式:

  1. 使用expr指令 a = $(expr 1 + 2)
  2. 使用letlet a=(1 + 2)
  3. 使用$(())语法,a = $((1 + 2))

获取字符串变量的长度:

echo ${#str}

循环的语法:

for i in list; do
...
done

while [ condition ]; do
...
done

until [ condition ]; do
...
done

运行bash使用debug模式 bash -x xxx.sh,debug模式下,在运行命令之前都会输出命令内容。在bash中可以使用set -x来开启调试功能,使用set +x来关闭调试功能。

使用mktemp命令生成随机的临时文件或者临时目录:

# 使用X表示随机字符,使用 `|| exit 1`的方式来判断,如果没有成功,直接返回。
TEMP=$(mktemp /tmp/tempfile.XXXXXX) || exit 1

# `-d`表示生成目录
TEMPDIR=$(mktemp -d /tmp/tempdir.XXXXX) || exit 1

输出重定向到/dev/null可以见输出全部屏蔽掉:

cat xxx-file > /dev/null

使用系统环境变量$RANDOM得到随机数字。

使用w命令显示当前登陆人信息,以及做了什么事情。而uptime现实当前已经运行了多久。

cpu load avarages有三个参数,分别表示前1min/5min/15min系统CPU平均运行负载率。

在命令的后面加入&表示讲命令放在后台运行:

(date; sleep 10; date; sleep 1000; date) > date.out &

运行上面命令后,会在后台运行操作,使用jobs可以看到当前后台运行的程序,使用fg见程序放到前台运行

# 第一个后台操作为%1,默认fg等于fg %1
fg %1

然后用Ctrl+Z暂停该任务,如果想继续该任务使用

bg %1

任务又会在后台运行,使用kill %1杀死该后台程序。

bash programming practice


编程的时候,有时候需要使用三元的运算符,比如幅值语句,根据当前的if条件判断是不是设置合理的数值。

一种写法使用运算符求值的方式来得到应该返回的数值,比如:

ternary-operator-in-bashlink
# 通过echo将最终的数值通过运算符进行返回,等价于变为了直接的宏替换
a=$([ "$b" == 5 ] && echo "$c" || echo "$d")

还有一种方式就是直接通过test测试,将幅值语句写两次,这样子反而好像更加的清晰直观():

conditional-assignment-based-on-environment-variablelink
[[ "$MYAPP_ENV" = PROD ]] && a=1 || a=2