46 lines
1.1 KiB
Plaintext
46 lines
1.1 KiB
Plaintext
|
#!/usr/bin/env python
|
||
|
# Exercise 12f
|
||
|
# tail command
|
||
|
|
||
|
import sys
|
||
|
import argparse
|
||
|
from pathlib import Path
|
||
|
|
||
|
parser = argparse.ArgumentParser()
|
||
|
parser.add_argument("stream", default=sys.stdin, nargs="*")
|
||
|
parser.add_argument("-v", "--verbose", action="store_true")
|
||
|
parser.add_argument("-n", "--lines", default="10", type=str)
|
||
|
args = parser.parse_args()
|
||
|
res = []
|
||
|
|
||
|
|
||
|
def intonum(n):
|
||
|
try:
|
||
|
return abs(int(n))
|
||
|
except ValueError:
|
||
|
print(f"tail: el número de líneas no es válido: «{n}»")
|
||
|
sys.exit(1)
|
||
|
|
||
|
|
||
|
def getlines(lines, n):
|
||
|
lines = list(map(lambda l: l.rstrip(), lines))
|
||
|
num = intonum(n)
|
||
|
if n[0] == "+":
|
||
|
return lines[num-1:]
|
||
|
return lines[-num:]
|
||
|
|
||
|
|
||
|
if isinstance(args.stream, list):
|
||
|
for path in args.stream:
|
||
|
lines = Path(path).open().readlines()
|
||
|
header = [""] if len(res) != 0 else []
|
||
|
if args.verbose:
|
||
|
header += [f"==> {path} <=="]
|
||
|
res += header + getlines(lines, args.lines)
|
||
|
else:
|
||
|
lines = args.stream.readlines()
|
||
|
header = ["==> entrada estándar <=="] if args.verbose else []
|
||
|
res += header + getlines(lines, args.lines)
|
||
|
|
||
|
print("\n".join(res))
|