### Shell学习资料知识点详解
#### 一、Shell脚本语言介绍
**Shell**是一种脚本语言,主要用于控制Unix或类Unix系统(如Linux)中的各种程序和服务。它为用户提供了一个命令行界面,允许用户通过一系列命令来执行各种任务。Shell脚本是用这种语言编写的程序,用于自动化执行一系列命令。
#### 二、常用Shell命令详解
根据提供的描述和部分内文,我们可以总结出以下一些常用的Shell命令及其功能:
1. **目录操作**
- `ls -al`: 列出当前目录下所有文件和子目录的详细信息。
- `ls -d */`: 显示每个子目录的信息,而不是列出其内容。
- `ls --file-type | grep -v /$ | tr '\n' ';' echo`: 显示所有非目录文件,并在每个文件名之间添加分号作为分隔符。
2. **文件创建与编辑**
- `touch`: 创建一个新文件或更新现有文件的时间戳。
- `> file`: 清空文件内容并打开标准输入,可以用来重定向输入到文件。
- `cat > file`: 创建新文件并接收标准输入直到用户按Ctrl+D。
- `edit`: 使用文本编辑器编辑文件。
- `cat >`: 与`cat > file`类似,但不指定文件名,通常用于管道操作。
3. **文件搜索**
- `grep -n ".*" data.f`: 搜索文件`data.f`中所有包含任意字符的行,并显示行号。
- `sed = filename`: 在文件`filename`的每一行前添加行号。
- `cat -n [-b] filename`: 类似于`sed = filename`,但可以跳过空白行(如果使用`-b`选项)。
- `nl`: 与`cat -n`类似,但默认不显示空白行的行号。
4. **特殊字符和模式匹配**
- `grep '48\>' data.f`: 搜索以数字48开头的行。
- `grep 48[^0-9] data.f`: 搜索以48开头且紧随其后的是非数字字符的行。
- `grep "48<tab>" data.f`: 搜索以48开头且后面跟着制表符的行。
- `grep -v '^48' data.f`: 搜索不以48开头的行。
- `grep -E '219|216' data.f`: 使用扩展正则表达式搜索含有219或216的行。
- `grep '5[[:upper:]][[:upper:]]' data.f`: 搜索以5开头后跟两个大写字母的行。
5. **文件内容提取与处理**
- `sed -n '1,$p' data.f`: 显示文件`data.f`的所有行。
- `cat -v filename`: 显示文件`filename`的内容,包括不可打印字符的可视表示形式。
- `route/netstat -r/netstat -rn`: 查看路由表或网络连接状态。
6. **Awk变量使用**
- `NR`: 当前记录的行号,在整个文件中是唯一的。
- `FNR`: 当前文件中的行号,对于每个文件都是独立计算的。
- 例子:使用`awk`合并两个文件的内容,根据共同的字段进行组合。
```bash
awk -F'|' 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr
```
这里,`NR==FNR`用于判断是否正在读取第一个文件(`account`)。如果是,则存储该行到数组`a`中;如果不是,则从第二个文件(`cdr`)读取行,并将第一个文件中对应的行与当前行的第二列合并输出。
7. **Cut命令的使用**
- `cut -d ':' -f 1,2 test.txt`: 从文件`test.txt`中提取第一列和第二列,列之间的分隔符为冒号。
- `-b`: 以字节为单位选择输出字段。
- `-c`: 以字符为单位选择输出字段。
- `-d`: 设置字段分隔符,默认为制表符。
- `-f`: 指定要输出的字段。
- `-n`: 当与`-b`一起使用时,输出字段的补集。
- `-s`: 只打印由字段分隔符完全定义的行。
8. **Sort命令的使用**
- `sort -t: +1 vegetables`: 对文件`vegetables`进行排序,其中字段分隔符为冒号,从第二列开始排序。
9. **环境变量与配置**
- `export GREP_OPTIONS='--color=auto'`: 配置grep命令支持彩色输出。
- 将上述命令添加到`.bash_profile`或`.bashrc`文件中可以使配置永久生效。
10. **Awk高级用法**
- `echo $PATH | awk 'BEGIN{FS=":";OFS="\n"}{for(i=1;i<=NF;i++){print $i;print "\n"}}' | grep 'usr'`: 分割`$PATH`环境变量中的路径,并筛选出包含`usr`的路径。
11. **文件内容统计**
- `cattest.txt | tr "\n" "#" | awk -F "23" '{print NF-1}'`: 统计文件中每行中“23”出现的次数,结果使用“#”分隔。
以上是对提供的“shell学习资料”中涉及的一些关键知识点的总结。这些命令和技巧对于掌握Shell脚本编写和提高日常操作效率至关重要。通过这些命令的学习和实践,可以极大地提高在Unix/Linux环境下的工作效率。