请教个Python问题:如何在Shell脚本中调用Python或使用Python替代Shell
例如有个文本文件格式如下(带空格):
aaa bbb ccc
判断 aaa 是否满足条件,如果满足条件,再判断 bbb,bbb 满足条件再判断 ccc,
aaa 大概有几十个条件,bbb 大概几百个,ccc 也大概几百个。这种方式怎么写合适,浪费各位大佬几分钟的时间,给个大概的方向,不甚感激,谢谢
请教个Python问题:如何在Shell脚本中调用Python或使用Python替代Shell
抛砖引玉,第一想法是用正则的 re.compile 来描述你的“条件”?
为 a 建立一个 rule_list_a = [condition1, condition2…condition 几十],b 和 c 以此类推。
然后写一个 def suit(string, rule_list) 遍历 rule_list,执行 re.match,返回一个 bool。
外层主函数就用 if suit(a, rule_list_a) and suit(b, rule_list_b) and suit(c, rule_c),只要按照顺序写,就能实现先后逻辑。
在Shell脚本里调用Python,或者用Python替代Shell,这事儿很常见。我一般这么干:
1. 在Shell脚本里调用Python脚本
最简单的方法就是用python命令直接执行你的.py文件:
#!/bin/bash
echo "Shell部分开始"
python3 your_script.py arg1 arg2
echo "Shell部分结束"
或者直接嵌入Python代码:
#!/bin/bash
python3 -c "
print('这是内嵌的Python代码')
import sys
print(f'参数: {sys.argv[1:]}')
" "$@"
2. 用Python完全替代Shell脚本
更推荐的做法是直接写Python脚本,用subprocess模块来执行系统命令:
#!/usr/bin/env python3
import subprocess
import sys
def main():
# 执行ls命令
result = subprocess.run(['ls', '-la'], capture_output=True, text=True)
print("命令输出:")
print(result.stdout)
# 处理文件
with open('output.txt', 'w') as f:
f.write('用Python生成的文件内容\n')
# 使用系统环境变量
import os
print(f"当前用户: {os.getenv('USER')}")
if __name__ == '__main__':
main()
记得给脚本加执行权限:chmod +x script.py
3. 处理命令行参数
Python的argparse比Shell的getopts好用多了:
import argparse
parser = argparse.ArgumentParser(description='示例脚本')
parser.add_argument('input', help='输入文件')
parser.add_argument('-o', '--output', help='输出文件')
args = parser.parse_args()
4. 文件操作 Python的文件操作比Shell的sed/awk更清晰:
# 读取文件
with open('file.txt') as f:
lines = f.readlines()
# 处理内容
processed = [line.strip().upper() for line in lines]
# 写入文件
with open('output.txt', 'w') as f:
f.write('\n'.join(processed))
总结建议:简单任务用Shell,复杂任务用Python。
非常感谢
这我一般直接写 awk 脚本
如果数据是表格格式的,可以用 pandas 读取一下,对每个元素都判断一下,然后按行返回每行第一个为 True 的
比如对于第 i 行,A 列 False,B 列 False,C 列 TRUE,你可以返回位置 2,也可以返回列名称。
用 awk 会很麻烦吧
感谢,我试试看
In Perl6, you can use junction:
say so “aaa” ~~ [aaa, bbb, ccc].all;
比较关心你的数据是什么形式的,两行之间什么关系,列之间是什么关系?如果是类似于 dict 这种有属性的可以考虑 Pandas ;如果是数据表的话直接数据库 SQL 会更好一些
几十个几百个条件,还有组合,我觉得第一件事是确定条件是否可以简化,现实中很少有这样几百个条件组合不能简化的场景吧
abc 三者的形式,和条件的内容,决定了用什么工具最合适,能不能快速搞定
想到一种 python 的做法,先将文本存入 list 中
file_list = [ [1,2,3], [4,5,6] ]
使用 filter 过滤,比如过滤掉第一列等于 1 的
filter(lambda x: x[0] != 1, file_list)
依次这么添加你的条件
如果数据量很大还可以写成 map-reduce 程序,在集群上运行

