shell脚本使用
shell脚本使用记录
- 1、Shell脚本:将文本行中的空格替换为换行并输出到新文件
- 使用方法
- 示例
- 替代方案
- 2、Shell脚本:删除文本文件中的空行
- 使用方法
- 示例
- 替代方案
- 3、Shell脚本:将每行12位16进制数据转换为二进制
- 脚本功能说明
- 使用示例
- 替代单行命令
- 注意事项
1、Shell脚本:将文本行中的空格替换为换行并输出到新文件
以下是一个简单的shell脚本,它可以读取输入文件中的每一行,将行内的空格替换为换行符,并将结果输出到一个新的文件中:
#!/bin/bash# 检查参数数量
if [ $# -ne 2 ]; thenecho "用法: $0 输入文件 输出文件"exit 1
fiinput_file=$1
output_file=$2# 检查输入文件是否存在
if [ ! -f "$input_file" ]; thenecho "错误: 输入文件 $input_file 不存在"exit 1
fi# 处理文件
while IFS= read -r line; do# 将空格替换为换行符并追加到输出文件echo "$line" | tr ' ' '\n' >> "$output_file"
done < "$input_file"echo "处理完成,结果已保存到 $output_file"
使用方法
- 将上述脚本保存为
split_lines.sh
- 赋予执行权限:
chmod +x split_lines.sh
- 运行脚本:
./split_lines.sh 输入文件.txt 输出文件.txt
示例
假设有一个输入文件 input.txt
内容如下:
hello world
this is a test
运行脚本后,输出文件 output.txt
内容将是:
hello
world
this
is
a
test
替代方案
如果你只需要一次性处理,也可以直接使用以下命令:
tr ' ' '\n' < 输入文件.txt > 输出文件.txt
这个单行命令与上面的脚本功能相同,但脚本提供了更好的错误处理和用户反馈。
2、Shell脚本:删除文本文件中的空行
以下是一个简单的shell脚本,它可以删除输入文件中的所有空行(包括只包含空白字符的行),并将结果输出到一个新的文件中:
#!/bin/bash# 检查参数数量
if [ $# -ne 2 ]; thenecho "用法: $0 输入文件 输出文件"exit 1
fiinput_file=$1
output_file=$2# 检查输入文件是否存在
if [ ! -f "$input_file" ]; thenecho "错误: 输入文件 $input_file 不存在"exit 1
fi# 删除空行和只含空白字符的行
grep -v '^[[:space:]]*$' "$input_file" > "$output_file"echo "处理完成,空行已删除,结果已保存到 $output_file"
使用方法
- 将上述脚本保存为
remove_empty_lines.sh
- 赋予执行权限:
chmod +x remove_empty_lines.sh
- 运行脚本:
./remove_empty_lines.sh 输入文件.txt 输出文件.txt
示例
假设有一个输入文件 input.txt
内容如下:
第一行第二行第三行第四行
运行脚本后,输出文件 output.txt
内容将是:
第一行
第二行
第三行
第四行
替代方案
如果你只需要一次性处理,也可以直接使用以下命令:
grep -v '^[[:space:]]*$' 输入文件.txt > 输出文件.txt
或者使用sed命令:
sed '/^[[:space:]]*$/d' 输入文件.txt > 输出文件.txt
或者使用awk命令:
awk 'NF' 输入文件.txt > 输出文件.txt
这些单行命令与上面的脚本功能相同,但脚本提供了更好的错误处理和用户反馈。
3、Shell脚本:将每行12位16进制数据转换为二进制
以下是一个专门处理12位16进制数据(6字节)转换为二进制表示的Shell脚本:
#!/bin/bash# 检查参数
if [ $# -ne 2 ]; thenecho "用法: $0 输入文件(12位16进制) 输出文件(二进制)"exit 1
fiinput_file=$1
output_file=$2# 检查输入文件
if [ ! -f "$input_file" ]; thenecho "错误: 输入文件 $input_file 不存在"exit 1
fi# 清空输出文件
> "$output_file"# 处理每一行12位16进制数据
while IFS= read -r hex_line; do# 移除所有空白字符hex_line=$(echo "$hex_line" | tr -d '[:space:]')# 验证长度是否为12if [ ${#hex_line} -ne 12 ]; thenecho "警告: 跳过非12位16进制行: $hex_line" >&2continuefi# 验证是否为有效16进制if [[ ! $hex_line =~ ^[0-9a-fA-F]{12}$ ]]; thenecho "警告: 跳过无效16进制行: $hex_line" >&2continuefi# 转换为二进制(每字节8位,共48位二进制),如果每行数据更多,可以修改循环最大值binary=$(echo "$hex_line" | xxd -r -p | xxd -b | awk '{for(i=2;i<=7;i++) printf $i}' | tr -d ' ')# 写入输出文件echo "$binary" >> "$output_file"
done < "$input_file"echo "转换完成,24位二进制结果已保存到 $output_file"
脚本功能说明
-
输入验证:
- 确保每行正好是12位16进制字符(6字节)
- 自动跳过无效或长度不正确的行
-
转换逻辑:
- 使用
xxd -r -p
将16进制转换为二进制数据 - 再用
xxd -b
将二进制数据转换为二进制表示形式 - 通过awk和tr清理格式,得到连续的48位二进制串
- 使用
-
输出格式:
- 每行对应输入文件的一行
- 每行输出48位二进制(6字节 × 8位)
使用示例
输入文件 hex12_input.txt
内容:
A1B2C3D4E5F6
123456789ABC
FFEEDDCCBBAA
运行脚本:
./hex12_to_binary.sh hex12_input.txt binary_output.txt
输出文件 binary_output.txt
内容:
101000011011001011000011110101001110010111110110
000100100011010001010110011110001001101010111100
111111111110111011011100110010111011101010101010
替代单行命令
如果只需要简单转换,可以使用这个perl单行命令:
perl -ne 'chomp; s/\s+//g; print unpack("B24", pack("H12", $_)) . "\n" if length($_) == 12' input.txt > output.txt
注意事项
- 严格限制每行输入必须正好是12位16进制字符
- 输出固定为48位二进制(前面不会补零)
- 对于大文件处理,可能需要考虑性能优化
- 如果16进制字符串中有空格或换行符,脚本会自动去除