AI 写作痕迹识别与去除

什么是 AI 味,怎么去 AI 味

什么是 AI 味,怎么去 AI 味 AI 写作痕迹识别与去除完全指南 可能很多人对 AI 写的文章有意见。读几句就能感觉不对劲,但又说不上具体哪里有问题。 这种味道不是凭空而来的。它背后有一套严格的数学机制在运作,而理解这套机制,是去除 AI 味的起点。 AI 味(AI Writing Tropes):大型语言模型(LLM)在生成文本时表现出的可识别模式。这些模式源于模型的统计预测本质,表现为过度使用某些词汇、句式和结构,使文本读起来机械化、模板化。 图 1:AI 生成文本的词汇选择分布与人工写作的差异。横轴为词汇的"AI 倾向指数",纵轴为出现频率。可以看到 AI 文本在某些特定词汇上出现明显的峰值。 第一章:AI 味的本质 要理解 AI 味,我们需要暂时离开文字本身,去看看那些生成文字的模型是如何工作的。 想象你在玩一个猜词游戏。朋友给你看一句话的前半部分,让你猜下一个词是什么。比如:“我今天早上吃了一碗______"。你可能会猜"面条”、“粥”、“麦片”。这三个答案都不错,但直觉告诉你,“面条"和"粥"比"麦片"更符合中文语境。 大型语言模型(LLM, Large Language Model):基于 Transformer 架构的神经网络,通过预测序列中下一个词的概率分布来生成文本。可以把它想象成一个超级猜词游戏玩家,它见过数以亿计的句子,对每个词出现在特定位置的可能性都有精细的估计。 LLM 本质上就是这样一个猜词机器。它接收一段文字,计算每个可能的后续词的概率,然后选择其中一个作为输出。这个过程循环往复,直到生成完整的段落。 这里有一个关键问题:当模型面对多个"都不错"的选择时,它会怎么决定? 答案藏在它的训练目标里。LLM 被训练来最大化训练数据的似然概率,也就是说,它倾向于选择"在训练数据中最常见"的表达。这就好比一个人在陌生的城市里,总是本能地走向人最多的那条街。 但这里有个微妙的扭曲。模型还有一个"重复惩罚"机制。如果它刚刚用过某个词,这个词在下一步的概率会被刻意压低。这就像是一个试图展现词汇量的考生,刻意避免连续使用同一个词。结果呢?模型开始寻找同义词、近义词,甚至是更"花哨"的替代方案。 重复惩罚(Repetition Penalty):LLM 生成过程中施加的一种约束,用于降低近期已出现词汇的采样概率。原本是为了避免单调重复,却导致模型过度追求词汇变化,产生不自然的同义词替换。 再加上 RLHF(基于人类反馈的强化学习)训练,模型被进一步引导去生成"看起来不错"的文本。它学会了人类的某些偏好,比如喜欢有结构的开头、平衡的正反面论述、以及乐观向上的结尾。这些偏好本身没有错,但当它们被机械地执行时,就产生了那种 unmistakable 的 AI 感。 RLHF(Reinforcement Learning from Human Feedback):一种训练技术,通过人类评分者的偏好反馈来微调模型。可以想象成让模型参加一场持续的考试,每次生成后都由人类老师打分,模型逐渐学会什么样的答案能得高分。 所以,AI 味的本质是什么?它是统计学最可能结果的堆砌,是避免重复的强迫症的产物,是 RLHF 训练留下的指纹。当你读到"此外”、“值得注意的是”、“深入探讨"这些词时,你听到的其实是模型在低声说:“根据我的计算,这是最安全的下一个词。” 第二章:AI 味的六大类别 现在让我们进入实战环节。社区已经识别出几十个典型的 AI 写作模式。我将其归纳为六大类别,每一类都有其独特的"症状"和"治疗方案”。 图 2:AI 写作模式的六大类别及其相互关系。这些模式相互交织,形成复杂的"AI 味"网络。 ...

March 22, 2026 · 4 min · 670 words · s-ai-unix
文本处理命令行

Shell文本处理三剑客:sed、awk与grep实战指南

在Unix/Linux系统中,sed、awk和grep被称为文本处理三剑客。它们各自擅长不同的文本处理任务,配合使用可以解决绝大多数文本处理需求。本文将通过实战示例帮助你掌握这些工具的核心用法。 grep:文本搜索利器 基本搜索 grep主要用于在文件中搜索匹配特定模式的行。 # 在文件中搜索单词 grep "pattern" file.txt # 递归搜索目录 grep -r "pattern" /path/to/dir # 忽略大小写 grep -i "pattern" file.txt # 显示行号 grep -n "pattern" file.txt # 反向匹配(不包含pattern的行) grep -v "pattern" file.txt # 统计匹配行数 grep -c "pattern" file.txt 多文件操作 # 查找在多个文件中都存在的行 grep -F -x -f file1 file2 file3 # 查找在file1中但不在file2中的行 grep -F -x -v -f file2 file1 # 在多个文件中搜索 grep "pattern" file1.txt file2.txt file3.txt 参数说明: -F:将模式视为固定字符串而非正则表达式 -x:整行匹配 -f:从文件读取模式 -v:反向选择 实用示例 # 查找包含"error"或"warning"的行 grep -E "(error|warning)" logfile.txt # 查找以"#"开头的注释行 grep "^#" config.conf # 查找空行 grep "^$" file.txt # 查找非空行 grep -v "^$" file.txt # 查找恰好10个字符的行 grep -E "^.{10}$" file.txt # 递归查找当前目录下所有.py文件中的"TODO" grep -r "TODO" --include="*.py" . sed:流编辑器 sed是一个强大的流编辑器,擅长进行文本替换和删除操作。 ...

December 18, 2015 · 5 min · 867 words · s-ai-unix
终端命令行

Shell脚本编程最佳实践

Shell脚本是系统管理和自动化任务的利器。本文将带你从基础到高级,全面掌握Shell脚本编程的最佳实践。 Shell基础 第一个Shell脚本 #!/bin/bash # 这是一个注释 echo "Hello, World!" # 变量赋值和使用 name="World" echo "Hello, $name!" # 命令替换 current_date=$(date) echo "Today is: $current_date" # 反引号方式(不推荐) current_date=`date` echo "Today is: $current_date" Shebang说明: #!/bin/bash:使用bash解释器 #!/bin/sh:使用sh解释器(更通用) #!/usr/bin/env bash:自动查找bash(更便携) 变量和数据类型 # 字符串变量 greeting="Hello" name="Alice" # 只读变量 readonly PI=3.14159 # 删除变量 unset name # 环境变量 export PATH=$PATH:/new/path # 字符串拼接 fullname="John $greeting" echo $fullname # 获取字符串长度 string="Hello, World" echo ${#string} # 13 # 字符串切片 echo ${string:0:5} # Hello echo ${string:7} # World # 默认值 echo ${name:-"Guest"} # 如果name未设置或为空,使用"Guest" # 数组 arr=(apple banana cherry) echo ${arr[0]} # apple echo ${arr[@]} # 所有元素 echo ${#arr[@]} # 数组长度 arr[3]="date" # 添加元素 unset arr[1] # 删除元素 控制结构 条件判断 # if语句 if [ "$name" == "Alice" ]; then echo "Welcome, Alice!" elif [ "$name" == "Bob" ]; then echo "Welcome, Bob!" else echo "Welcome, Guest!" fi # 数字比较 count=10 if [ $count -eq 10 ]; then echo "Count is 10" fi if [ $count -gt 5 ]; then echo "Count is greater than 5" fi if [ $count -lt 20 ]; then echo "Count is less than 20" fi # 字符串比较 if [ "$string1" == "$string2" ]; then echo "Strings are equal" fi if [ -n "$string" ]; then echo "String is not empty" fi # 文件测试 if [ -f "file.txt" ]; then echo "File exists and is a regular file" fi if [ -d "/tmp" ]; then echo "Directory exists" fi if [ -r "file.txt" ]; then echo "File is readable" fi if [ -w "file.txt" ]; then echo "File is writable" fi if [ -x "script.sh" ]; then echo "File is executable" fi # 逻辑运算 if [ $count -gt 5 ] && [ $count -lt 20 ]; then echo "Count is between 5 and 20" fi if [ $count -lt 5 ] || [ $count -gt 20 ]; then echo "Count is outside range 5-20" fi # 使用test命令 if test -f "file.txt"; then echo "File exists" fi # 双括号(更强大的算术比较) if (( count > 5 && count < 20 )); then echo "Count is between 5 and 20" fi 循环结构 # for循环 for i in 1 2 3 4 5; do echo $i done # 遍历文件 for file in *.txt; do echo "Processing: $file" done # C风格for循环 for ((i=0; i<10; i++)); do echo $i done # while循环 count=0 while [ $count -lt 5 ]; do echo $count count=$((count + 1)) done # 读取文件行 while IFS= read -r line; do echo "$line" done < file.txt # until循环 count=0 until [ $count -ge 5 ]; do echo $count count=$((count + 1)) done # break和continue for i in {1..10}; do if [ $i -eq 5 ]; then continue # 跳过5 fi if [ $i -eq 8 ]; then break # 在8处停止 fi echo $i done case语句 # 简单的case语句 read -p "Enter a color: " color case $color in red) echo "You chose red" ;; blue|green) echo "You chose blue or green" ;; *) echo "You chose something else" ;; esac # 复杂的case语句 case $1 in start) echo "Starting service..." ;; stop) echo "Stopping service..." ;; restart) echo "Restarting service..." ;; status) echo "Checking service status..." ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac 函数编程 定义和使用函数 # 定义函数 greet() { echo "Hello, $1!" } # 调用函数 greet "Alice" # 返回值 add() { local result=$(($1 + $2)) echo $result } sum=$(add 5 3) echo "Sum: $sum" # 返回状态码 check_file() { if [ -f "$1" ]; then return 0 # 成功 else return 1 # 失败 fi } if check_file "file.txt"; then echo "File exists" else echo "File does not exist" fi # 局部变量 global_var="I am global" my_function() { local local_var="I am local" echo "Inside function: $local_var" echo "Inside function: $global_var" } my_function echo "Outside function: $global_var" # echo "Outside function: $local_var" # 错误:local_var未定义 函数参数 # 处理多个参数 process_args() { echo "First argument: $1" echo "Second argument: $2" echo "All arguments: $@" echo "Number of arguments: $#" echo "Script name: $0" } process_args arg1 arg2 arg3 # 遍历所有参数 iterate_args() { for arg in "$@"; do echo "Processing: $arg" done } iterate_args file1.txt file2.txt file3.txt # shift命令 shift_test() { echo "Total arguments: $#" echo "First: $1" shift echo "After shift, first: $1" echo "Remaining arguments: $#" } shift_test a b c d 递归函数 # 阶乘(尾递归) factorial() { local n=$1 local acc=${2:-1} if [ $n -le 1 ]; then echo $acc else factorial $((n - 1)) $((acc * n)) fi } echo "Factorial of 5: $(factorial 5)" # Fibonacci fibonacci() { local n=$1 if [ $n -le 1 ]; then echo $n else echo $(( $(fibonacci $((n - 1))) + $(fibonacci $((n - 2))) )) fi } echo "Fibonacci of 10: $(fibonacci 10)" 输入输出 读取用户输入 # 简单输入 read -p "Enter your name: " name echo "Hello, $name!" # 密码输入(不显示) read -s -p "Enter password: " password echo # 带超时的输入 read -t 5 -p "Enter your choice (5 seconds): " choice echo "You chose: $choice" # 读取多个值 read -p "Enter name age: " name age echo "Name: $name, Age: $age" # 从文件读取 while IFS= read -r line; do echo "Line: $line" done < input.txt # 读取确认 read -p "Continue? (y/n): " confirm if [[ $confirm == [yY] ]]; then echo "Continuing..." else echo "Aborting..." exit 1 fi 输出格式化 # echo选项 echo -n "No newline" # 不换行 echo -e "Line1\nLine2" # 解释转义字符 echo "Hello\tWorld" # 需要配合-e # printf格式化输出 printf "Name: %s, Age: %d\n" "Alice" 25 printf "Pi: %.2f\n" 3.14159 printf "%-10s %10s\n" "Left" "Right" # 重定向输出 echo "Error message" >&2 # 输出到stderr echo "Log message" >> logfile # 追加到文件 # 管道 echo "Hello World" | tr '[:upper:]' '[:lower:]' # Here文档 cat << EOF This is a multi-line string using Here document. EOF # Here字符串 grep "pattern" <<< "This is a string to search" 命令行参数 处理位置参数 #!/bin/bash # script.sh echo "Script name: $0" echo "First argument: $1" echo "Second argument: $2" echo "All arguments: $@" echo "Number of arguments: $#" # 检查参数数量 if [ $# -lt 2 ]; then echo "Usage: $0 <arg1> <arg2>" exit 1 fi 使用getopts #!/bin/bash # 使用getopts处理选项 usage() { echo "Usage: $0 [-a] [-b VALUE] [-c] filename" exit 1 } while getopts ":ab:c" opt; do case $opt in a) echo "Option -a triggered" ;; b) echo "Option -b triggered with value: $OPTARG" value=$OPTARG ;; c) echo "Option -c triggered" ;; \?) echo "Invalid option: -$OPTARG" usage ;; :) echo "Option -$OPTARG requires an argument" usage ;; esac done shift $((OPTIND-1)) echo "Remaining arguments: $@" 使用getopt(更强大) #!/bin/bash # 使用getopt处理长选项 TEMP=$(getopt -o ab:c:: --long alpha,bravo:,charlie:: -n 'example.sh' -- "$@") if [ $? != 0 ]; then echo "Terminating..." >&2 exit 1 fi eval set -- "$TEMP" while true; do case "$1" in -a|--alpha) echo "Option a" shift ;; -b|--bravo) echo "Option b, argument '$2'" shift 2 ;; -c|--charlie) case "$2" in "") echo "Option c, no argument" shift 2 ;; *) echo "Option c, argument '$2'" shift 2 ;; esac ;; --) shift break ;; *) echo "Internal error!" exit 1 ;; esac done echo "Remaining arguments:" for arg in "$@"; do echo " --> '$arg'" done 信号处理 捕获中断 #!/bin/bash # 捕获Ctrl+C cleanup() { echo "Cleaning up..." # 删除临时文件等 rm -f /tmp/my_script_temp* exit 1 } trap cleanup SIGINT SIGTERM echo "Press Ctrl+C to interrupt..." for i in {1..100}; do echo "Working... $i" sleep 1 done 捕获EXIT信号 #!/bin/bash # 确保清理代码总是执行 cleanup() { echo "Script is exiting..." rm -f /tmp/tempfile } trap cleanup EXIT # 创建临时文件 touch /tmp/tempfile echo "Doing some work..." # 即使脚本出错,cleanup也会执行 文本处理 文件操作 # 读取文件 while IFS= read -r line; do echo "$line" done < file.txt # 写入文件 echo "Hello" > output.txt echo "World" >> output.txt # 检查文件是否存在 if [ -f "file.txt" ]; then echo "File exists" fi # 检查文件是否可读 if [ -r "file.txt" ]; then echo "File is readable" fi # 获取文件大小 size=$(wc -c < file.txt) echo "File size: $size bytes" # 获取行数 lines=$(wc -l < file.txt) echo "File lines: $lines" 文本转换 # 转换为大写 echo "hello" | tr '[:lower:]' '[:upper:]' # 删除重复行 sort file.txt | uniq # 只显示重复行 sort file.txt | uniq -d # 统计重复次数 sort file.txt | uniq -c # 替换文本 sed 's/old/new/g' file.txt # 删除空行 sed '/^$/d' file.txt # 提取特定列 awk '{print $1, $3}' file.txt # 按模式分割文件 awk '/pattern/{filename="part_"++count".txt"; print > filename}' 进程管理 后台执行 # 后台运行 command & # 后台运行并重定向输出 command > /dev/null 2>&1 & # 使用nohup(退出终端后继续运行) nohup command & # 查看后台任务 jobs # 带回后台任务 fg %1 # 继续后台任务 bg %1 # 杀死后台任务 kill %1 进程监控 # 查看进程 ps aux # 查找特定进程 ps aux | grep nginx # 实时监控 top # 杀死进程 kill PID kill -9 PID # 强制杀死 # 等待进程完成 wait PID 调试技巧 调试模式 #!/bin/bash # 启用调试模式 set -x # 在执行前打印命令 set -v # 打印输入行 # 或者 bash -x script.sh # 只调试部分代码 set -x # 开始调试 # 需要调试的代码 set +x # 结束调试 错误处理 #!/bin/bash # 遇到错误立即退出 set -e # 使用未定义变量时报错 set -u # 管道命令失败时退出 set -o pipefail # 组合使用 set -euo pipefail # 捕获错误 trap 'echo "Error on line $LINENO"; exit 1' ERR 日志记录 #!/bin/bash # 日志函数 log() { local level=$1 shift echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $@" | tee -a script.log } log INFO "Script started" log ERROR "An error occurred" log WARNING "This is a warning" 实用示例 系统监控脚本 #!/bin/bash # 系统监控脚本 while true; do clear echo "=== System Monitor ===" echo "Time: $(date)" echo # CPU使用率 echo "CPU Usage:" top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1"%"}' # 内存使用 echo -e "\nMemory Usage:" free -h # 磁盘使用 echo -e "\nDisk Usage:" df -h sleep 5 done 日志分析脚本 #!/bin/bash # Apache日志分析 log_file="/var/log/apache2/access.log" echo "=== Top 10 IPs ===" awk '{print $1}' "$log_file" | sort | uniq -c | sort -rn | head echo -e "\n=== Top 10 URLs ===" awk '{print $7}' "$log_file" | sort | uniq -c | sort -rn | head echo -e "\n=== HTTP Status Codes ===" awk '{print $9}' "$log_file" | sort | uniq -c | sort -rn 自动备份脚本 #!/bin/bash # 自动备份脚本 SOURCE_DIR="/path/to/source" BACKUP_DIR="/path/to/backup" DATE=$(date +%Y%m%d_%H%M%S) BACKUP_NAME="backup_$DATE.tar.gz" # 创建备份 echo "Creating backup..." tar -czf "$BACKUP_DIR/$BACKUP_NAME" "$SOURCE_DIR" # 删除30天前的备份 find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +30 -delete echo "Backup completed: $BACKUP_NAME" 最佳实践 代码风格 使用Shebang:始终在脚本开头指定解释器 添加注释:解释复杂逻辑和重要步骤 使用有意义的变量名:避免单字母变量(除循环变量外) 缩进代码:使用一致的缩进(通常是4个空格) 引用变量:始终使用引号包裹变量("$var"而非$var) 安全建议 验证输入:始终验证用户输入和参数 使用绝对路径:避免路径混淆 最小权限原则:只授予必要的权限 清理临时文件:脚本结束时清理 避免eval:除非绝对必要,否则不使用eval 性能优化 避免外部命令:尽量使用内置功能 减少子shell:避免不必要的进程创建 使用管道:而不是临时文件 批量处理:一次处理多个项目 缓存结果:避免重复计算 小结 Shell脚本是系统管理和自动化的强大工具。通过本文,你学习了: ...

November 2, 2015 · 8 min · 1691 words · s-ai-unix
终端命令行

Perl One-liners实用指南

Perl one-liners是命令行下的瑞士军刀,能够在不创建脚本文件的情况下快速完成复杂的文本处理任务。它们简洁、强大且高效。 命令行参数基础 常用参数 -e:执行后面的代码 -n:逐行读取输入,类似于while (<>) {...} -p:逐行读取并自动打印 -l:自动处理行结束符 -a:自动分割行到@F数组 -F:指定分割模式 -i:原地编辑文件 -M:加载模块 基本模式 # -n模式(不自动打印) perl -ne 'print if /pattern/' file.txt # -p模式(自动打印) perl -pe 's/old/new/g' file.txt # -i模式(原地编辑) perl -pi -e 's/old/new/g' file.txt # -a模式(自动分割) perl -lane 'print $F[0]' file.txt 文本处理 删除空行 # 删除所有空行 perl -ne 'print unless /^$/' file.txt cat file.txt | perl -ne 'print unless /^$/' # 删除连续空行,只保留一行 perl -00 -pe '' file.txt # 压缩/扩展空行为N行 perl -00 -pe '$_.="\n"x4' file.txt # 替代方案 perl -pi -e 's!^\s+?$!!' file.txt 行操作 # 在每行前添加空行 perl -pe 's//\n/' file.txt # 删除每行前导空格 perl -ple 's/^[ \t]+//' file.txt # 删除每行尾随空格 perl -ple 's/[ \t]+$//' file.txt # 删除首尾空格 perl -ple 's/^[ \t]+|[ \t]+$//g' file.txt 大小写转换 # 转换为大写 cat file | perl -nle 'print uc' # 驼峰式命名 cat file | perl -ple 's/(\w+)/\u$1/g' 搜索与替换 基本替换 # 全局替换 perl -pi -e 's/good/bad/g' file.txt # 只在匹配的行上替换 perl -pi -e 's/good/bad/g if /matched/' file # 多条件替换 cat file | perl -pe '/baz/ && s/foo/bar/' 复杂匹配 # 匹配多个正则(任意顺序) cat file | perl -ne '/AAA/ && /BBB/ && print' # 匹配正则序列 cat file | perl -ne '/AAA.*BBB.*CCC/ && print' # 不匹配某些模式 cat file | perl -ne '!/regex/ && print' # 不匹配多个模式 cat file | perl -ne '!/AAA/ && !/BBB/ && print' 行选择与过滤 按行号选择 # 打印第13行 perl -ne '$. == 13 && print && exit' file.txt # 打印前10行(模拟head -10) perl -ne 'print if $. <= 10' file.txt # 打印第一行(模拟head -1) cat file | perl -ne 'print; exit' # 打印最后一行 cat file | perl -ne '$last = $_; END { print $last }' # 或 cat file | perl -ne 'print if eof' # 打印最后10行(模拟tail -10) perl -ne 'push @a, $_; @a = @a[@a-10..$#a]; END { print @a }' file.txt # 打印行13-30 perl -ne 'print if $. >= 17 && $. <= 30' file.txt # 打印指定行 perl -ne 'print if $. == 13 || $. == 19 || $. == 67' file.txt # 排除特定行 perl -ne '$. != 13 && print' file.txt 按模式选择 # 打印两个正则之间的行 cat file | perl -ne 'print if /regex1/../regex2/' # 打印前一行 cat file | perl -ne '/regex/ && $last && print $last; $last = $_' # 打印后一行 cat file | perl -ne 'if ($p) { print; $p = 0 } $p++ if /regex/' # 只打印包含字母的行 perl -ne 'print if /^[[:alpha:]]+$/' file.txt 行统计 # 打印非空行数 cat file.txt | perl -le 'print scalar(grep{/./}<>)' # 打印空行数 cat file.txt | perl -lne '$a++ if /^$/; END {print $a+0}' # 或 cat file.txt | perl -le 'print scalar(grep{/^$/}<>)' # 或 cat file.txt | perl -le 'print ~~grep{/^$/}<>' # 匹配模式的行数(模拟grep -c) cat file.txt | perl -lne '$a++ if /good/; END {print $a+0}' # 或 cat file.txt | grep -c "good" 数据处理 数值计算 # 对每行的数字求和 cat file.txt | perl -MList::Util=sum -alne 'print sum @F' # 计算第一列的和 cat file.txt | perl -lane '$sum += $F[0]; END { print $sum }' # 计算所有数字的和 cat file.txt | perl -alne '$sum += $_ for @F; END { print $sum }' 数据转换 # Base64编码字符串 perl -MMIME::Base64 -e 'print encode_base64("string")' # Base64编码整个文件 perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)' file # Base64解码 perl -MMIME::Base64 -le 'print decode_base64("c3RyaW5n")' # URL转义 perl -MURI::Escape -le 'print uri_escape("1+2")' # URL反转义 perl -MURI::Escape -le 'print uri_unescape("1%2B2")' # HTML编码 perl -MHTML::Entities -le 'print encode_entities("<br>")' # HTML解码 perl -MHTML::Entities -le 'print decode_entities("&lt;br&gt;")' 重复行处理 # 查找所有重复行 perl -ne 'print if $a{$_}++' file.txt # 只打印第一次出现的重复行 perl -ne 'print if ++$a{$_} == 2' file.txt # 打印唯一行 perl -ne 'print unless $a{$_}++' file.txt 列表生成 生成序列 # 生成并打印字母表 perl -le 'print ("a".."z")' # 或 perl -le 'print a..z' # 或 perl -le 'print join "", ("a".."z")' # 生成1-100的奇数 perl -le '@odd = grep {$_ % 2 == 1} 1..100; print "@odd"' # 生成随机8字符密码 perl -le 'print map { ("a".."z")[rand 26] } 1..8' 数据分析 # 打印字符串长度 perl -le 'print length "hello boy"' # 计算数组元素数 perl -le '@array = ("a".."z"); print ~~@array' # 或 perl -le '@array = ("a".."z"); print scalar @array' # 或 perl -le '@array = ("a".."z"); print $#array + 1' # 获取字符的数值 perl -le 'print join ", ", map { ord } split //, "hello world"' 系统管理 用户信息 # 获取系统所有用户名 perl -a -F: -lne 'print $F[4]' /etc/passwd 日期计算 # 计算10天前的日期 perl -MPOSIX -le '@now = localtime; $now[3] -= 10; print scalar localtime mktime @now' 实用技巧 行号处理 # 添加行号 perl -ne 'print "$. $_"' file.txt # 或 perl -pe '$_ = "$. $_"' file.txt 长度过滤 # 打印长度>=80的行 perl -ne 'print if length >= 80' file.txt # 打印最长的行 perl -ne '$l = $_ if length($_) > length($l); END { print $l }' file.txt # 打印最短的行 perl -ne '$s = $_ if $. == 1; $s = $_ if length($_) < length($s); END { print $s }' file.txt 调试技巧 # 查看自动分割后的数组 cat file.txt | perl -MData::Dumper -alne 'print Dumper @F' 高级示例 复杂管道操作 # 实际工作中的复杂示例 cat file1.txt | \ perl -nle 'print $1 if /\b(__[0-9a-z]\w+)\b/i;' | \ sort | uniq | \ xargs -I {} grep {} -w fileb.txt | \ awk '$2==0' | \ awk '{print $7}' | \ sort | uniq | \ xargs -I {} grep {} -w filec.txt | \ awk '$8==0' | \ awk '{print $8," ",$13}' > /tmp/result.txt 这个命令链: ...

July 24, 2014 · 5 min · 873 words · s-ai-unix