请教个Python问题:如何在Shell脚本中调用Python或使用Python替代Shell

例如有个文本文件格式如下(带空格):
aaa bbb ccc
判断 aaa 是否满足条件,如果满足条件,再判断 bbb,bbb 满足条件再判断 ccc,
aaa 大概有几十个条件,bbb 大概几百个,ccc 也大概几百个。这种方式怎么写合适,浪费各位大佬几分钟的时间,给个大概的方向,不甚感激,谢谢
请教个Python问题:如何在Shell脚本中调用Python或使用Python替代Shell

12 回复

抛砖引玉,第一想法是用正则的 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 程序,在集群上运行

回到顶部